Я в тяжелой ситуации, которая суммируется по следующему коду.Работа с несколькими исключениями
try {
dangerousCode(); // Declares `throws ExecutionException`
}
catch (ExecutionException ex) {
handleIt();
throw ex;
}
catch (RuntimeException ex) {
handleIt();
throw new ExecutionException(ex);
}
finally {
notifyListeners(); // May throw RuntimeException!
}
Я хотел бы придерживаться договоров распространяющегося потенциального ExecutionException
производного от опасного кода - явно брошенного, или Обертывания RuntimeException
.
Однако слушатели в finally
блоке (которые я не контролирую) могут бросить другое выполнения исключения. Конечно, я также хотел бы уведомить клиента об этом событии.
Дилемма: У меня теперь есть два исключения на руках.
Я мог бы определить свой собственный тип исключения для обертывания обоих исключенных исключений.
class MyExecutionException {
Throwable getCause();
Throwable getSecondCause();
}
Мне просто интересно, есть ли другой способ решения этой проблемы?
Поскольку Java 7 вы можете использовать: '} поймать (ExecutionException | RuntimeException ех) {' – Sergi
@Sergi Я знаю , но тогда я буду обертывать «ExecutionException» с помощью другого «ExecutionException». В этом разница между обоими блоками catch. – afsantos
Если клиент действительно должен знать обо всех исключениях, вам нужно что-то вроде вашей обертки. Единственный другой способ, о котором я могу думать, - это узнать, если вы знаете, что клиент должен будет выполнить некоторую обширную работу по восстановлению из вашего исключения и добавить метод 'callMeToNotifyAllClientsAfterRecoveryFromDangerousCode()', который уведомляет слушателей о том, что ваш клиент сделал для восстановления после первого исключения , –