我正在尝试使用拦截@Finally
在控制器中进行异常处理的演示。
我在控制器中做了一个有意的NullPointerException
,并尝试在@Finally
块中捕获异常。
当我尝试这个时它起作用:
@Finally
static void log(Throwable e) {
if( e == null ){
Logger.info("Inside FInally: Action call was successful");
} else{
Logger.info("Inside Finally: Action call failed", e);
}
}
但是,如果我尝试这个它不起作用:
@Finally
static void log(NullPointerException e) {
if( e == null ){
Logger.info("Inside FInally: Action call was successful");
} else{
Logger.info("Inside Finally: Action call failed", e);
}
}
如果我考虑@Catch
拦截,那么以下两种方法都有效:
@Catch(value = Throwable.class , priority = 2)
public static void te(Throwable throwException){
.....
}
@Catch(value = NullPointerException.class , priority = 1)
public static void npe(Throwable throwNullPointerException){
.....
}
为什么第二种情况不能用于@Finally
拦截?是否强迫将仅 Throwable
超类用于任何类型的异常,而不是使用任何特定的子类异常?
请让我知道这件事。
答案 0 :(得分:1)
在线开发者指南没有明确说明您不能使用特定的Exception类型。但考虑到 @Finally intercetpion背后的想法,我想你是对的;也就是说, @Finally 只接受Throwable。
让我们从这个方面考虑一下,如果你在方法中有多个catch语句,如果抛出异常,只会触发一个catch。在这种情况下,如果参数是 NPE ,但实际上抛出 DBConnectionTimeout (例如),则会令人困惑。因此,现在你的拦截器可以与其他类型的激活一起使用,也不会有多个@Finally拦截器。