拦截@Finally和@Catch

时间:2013-02-03 05:30:57

标签: java playframework playframework-1.x

我正在尝试使用拦截@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超类用于任何类型的异常,而不是使用任何特定的子类异常?

请让我知道这件事。

1 个答案:

答案 0 :(得分:1)

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

让我们从这个方面考虑一下,如果你在方法中有多个catch语句,如果抛出异常,只会触发一个catch。在这种情况下,如果参数是 NPE ,但实际上抛出 DBConnectionTimeout (例如),则会令人困惑。因此,现在你的拦截器可以与其他类型的激活一起使用,也不会有多个@Finally拦截器。