我处于一种严峻的形势,由以下代码总结。
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();
}
我只是想知道,还有另外一种解决这个问题的方法吗?
答案 0 :(得分:1)
我只是想知道,还有另外一种解决这个问题的方法吗?
你的想法非常好。使用嵌套在try-catch
或catch
语句中的finally
自己的类是常见的做法。在较大的应用中,这种结构几乎是不可避免的。
你的课程看起来像这样:
class MyExecutionException extends MyLogicException {
//what happened in the first place
Throwable getOriginException();
// what have we tried?
Throwable getRecoveryException();
// more than 1 thing can happen in recovery, order is important, hence list
List<Throwable> getAllExceptions();
}
这种方法可以让您将所有信息放在一个位置,并且可以非常轻松地实现异常处理和记录的单个位置。只需确保您的异常包装/容器类尽可能多样化,以满足您未来的需求。
答案 1 :(得分:0)
您可以使用两种方法initCause()
和getCause()
,它们可以包装您的例外:
Exception e = new Exception();
e.initCause(new Exception());
Throwable t = e.getCause(); //returns Throwable