Можно ли определить, произошло ли исключение до того, как я вошел в блок finally?
Есть ли в 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
}
Очевидно, есть ряд других подобных кладж, которые могут включать сохранение исключения как переменную-член, возвращение его из метода и т. Д., Но я ищу что-то более элегантное.
Может быть что-то вродеThread.getPendingException()
или что-то подобное? В этом отношении, есть ли элегантное решение на других языках?
Этот вопрос фактически возник из комментариев вДругой вопрос это подняло интересный вопрос.