1

我正在尝试使用拦截在控制器中进行异常处理的演示@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使用超类而不是使用任何特定的子类异常是否是一种强迫行为?

请让我知道这件事。

4

1 回答 1

1

在线开发人员指南没有明确说明您不能使用特定的异常类型。但是考虑到这个@Finally intercetpion 背后的想法,我想你是对的;也就是说,@Finally只接受 Throwable。

我们从这个角度考虑,如果方法中有多个catch语句,如果抛出异常,只会触发一个catch。在这种情况下,如果参数是NPE但实际上抛出了DBConnectionTimeout(例如),那将是令人困惑的。因此,您的拦截器无法与其他类型的异常一起使用,您也不能拥有多个 @Finally 拦截器。

于 2013-02-03T05:45:36.753 回答