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){
    .....
 }

2 番目のシナリオが@Finally傍受で機能しないのはなぜですか? 特定のサブクラスの例外を使用するのではなく、あらゆる種類の例外にスーパークラスのみ を使用することは強制ですか?Throwable

これについて教えてください。

4

1 に答える 1

1

オンライン開発者ガイドでは、特定の例外タイプを使用できないと明示的に述べていません。しかし、この@Finally intercetpion の背後にある考え方を考えると、あなたは正しいと思います。つまり、@Finallyは Throwable のみを受け取ります。

このように考えてみると、メソッドに複数の catch ステートメントがあると、例外がスローされた場合に 1 つの catch だけがトリガーされます。この場合、引数がNPEであるのに DBConnectionTimeout (たとえば) が実際にスローされると混乱します。したがって、インターセプターが他のタイプの例外で機能することは決してありません。また、複数の @Finally インターセプターを持つこともできません。

于 2013-02-03T05:45:36.753 に答える