В Java есть ли элегантный способ определить, произошло ли исключение до запуска блока finally? При работе с операторами "close()" обычно требуется обработка исключений в блоке finally. В идеале мы хотели бы сохранить оба исключения и распространять их (поскольку оба они могут содержать полезную информацию). Единственный способ, которым я могу это сделать, - иметь переменную за пределами области try-catch-finally, чтобы сохранить ссылку на возникшее исключение. Затем распространяйте "сохраненное" исключение с любым, что происходит в блоке finally.
Есть ли более элегантный способ сделать это? Может быть, вызов API, который откроет это?
Вот пример грубого кода, о котором я говорю:
Throwable t = null;
try {
stream.write(buffer);
} catch(IOException e) {
t = e; //Need to save this exception for finally
throw e;
} finally {
try {
stream.close(); //may throw exception
} catch(IOException e) {
//Is there something better than saving the exception from the exception block?
if(t!=null) {
//propagate the read exception as the "cause"--not great, but you see what I mean.
throw new IOException("Could not close in finally block: " + e.getMessage(),t);
} else {
throw e; //just pass it up
}
}//end close
}
Очевидно, что существует ряд других подобных kludges, которые могут включать сохранение исключения в качестве переменной-члена, возврат его из метода и т.д.... но я ищу что-то более элегантное.
Может быть что-то вроде Thread.getPendingException()
или что-то подобное? На самом деле, есть ли элегантное решение на других языках?
Этот вопрос фактически возник из комментариев в другом вопросе, который вызвал интересный вопрос.