我用一个catch-all处理程序编写了一个方法,但是我需要重新抛出异常,好像它是未处理的,这样调用堆栈的更多调用者可以处理它。这样做的简单方法就是:
try {
...
} catch (Exception ex) {
// do something here...
// and rethrow
throw ex;
}
但问题是,由于throw
语句,Java要求此方法将自己声明为throws Exception
,这反过来要求所有调用者处理异常或将自己声明为{ {1}}。等等调用链......
是否有任何简单的方法来重新抛出异常,就像当前方法没有处理它一样?
答案 0 :(得分:3)
对于(已检查)例外,您有两个选项:
try
/ catch
处理方法(可能包括重新抛出不同的异常类型)throws
例外。如果你想重新抛出异常,好像这个方法没有抓住它,你唯一的选择是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为什么你应该/不应该这样做