拦截并重新抛出Java未处理的异常

时间:2016-02-08 17:04:18

标签: java exception-handling

我用一个catch-all处理程序编写了一个方法,但是我需要重新抛出异常,好像它是未处理的,这样调用堆栈的更多调用者可以处理它。这样做的简单方法就是:

try {
   ...
} catch (Exception ex) {
   // do something here...
   // and rethrow
   throw ex;
}

但问题是,由于throw语句,Java要求此方法将自己声明为throws Exception,这反过来要求所有调用者处理异常或将自己声明为{ {1}}。等等调用链......

是否有任何简单的方法来重新抛出异常,就像当前方法没有处理它一样?

2 个答案:

答案 0 :(得分:3)

对于(已检查)例外,您有两个选项:

  1. 通过try / catch处理方法(可能包括重新抛出不同的异常类型)
  2. 声明方法throws例外。
  3. 如果你想重新抛出异常,好像这个方法没有抓住它,你唯一的选择是2。

    注意:如果catch (Exception e)阻止中的某个方法实际抛出try,则希望Exception。否则,捕获特定的异常类型。

答案 1 :(得分:2)

您可以执行@radoh所说的内容并将其包含在RuntimeException中,但这样做的一个缺点是您的堆栈跟踪现在已被污染,并且会将违规行显示为您声明throw new RuntimeException(ex)的位置。

另一种方法是使用Lomboks SneakyThrows机制,如下所示:

public static void main(String[] args) {
    methodWithException();
}

private static void methodWithException() {
    try {
        throw new Exception("Hello");
    } catch (Exception e) {
        Lombok.sneakyThrow(e);
    }
}

您的堆栈跟踪将保持不变,但您不再需要声明throws Exception

值得一读的是documentation为什么你应该/不应该这样做