Можно ли определить, произошло ли исключение до того, как я вошел в блок 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() или что-то подобное? В этом отношении, есть ли элегантное решение на других языках?

Этот вопрос фактически возник из комментариев вДругой вопрос это подняло интересный вопрос.

Ответы на вопрос(5)

Ваш ответ на вопрос