解决多个例外问题

时间:2013-12-20 12:25:16

标签: java exception exception-handling try-catch-finally

我处于一种严峻的形势,由以下代码总结。

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();
}

我只是想知道,还有另外一种解决这个问题的方法吗?

2 个答案:

答案 0 :(得分:1)

  

我只是想知道,还有另外一种解决这个问题的方法吗?

你的想法非常好。使用嵌套在try-catchcatch语句中的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