2017-11-19 22 views
0

私はいくつかのチェックをしているメソッドMにアノテーションを持っています。チェックが成功しなかった場合は、そのメソッドのメソッドMを実行したくありません。理由と一緒に通話が成功しなかった。例外から例外をスローする

これを達成するには、チェックが失敗した場合にアノテーションから例外をスローします。だからここに私が質問のカップルを持っている:

  1. IDEは、その例外は、メソッドの外に投げされていないことを私に伝えますので、私は特定の例外をキャッチすることができませんか。 私は速いハックのためにExceptionを捕まえて、instance of演算子を使って特定の例外に行きます。

    これを達成する他の方法はありますか?

  2. 例外をスローする必要はありませんか?

注釈アスペクトコードは次のようになります。IDEのみ例外をチェックし確認することができます

catch(Exception e){ 
    if(e instanceof CustomException){ 
     // do something 
    } 
} 
+6

コードを記述しないでください。投稿する。 –

+0

どうやってこれをやっていますか? Javaでは注釈の結果として例外がスローされません。そのためには、バイトコード変換のライブラリが必要です。どちらですか? –

+0

@JBNizet質問を更新しました。 –

答えて

4

@Before(value = "@annotation(abc)", argNames = "pjp, abc") 
public Object around(ProceedingJoinPoint pjp, ABC abc) throws Throwable { 
     if(notAllow()){ 
      throw new CustomException("Not allowed"); 
     } else { 
      pjp.proceed() 
     } 

    } 
} 

ハンドラのコードは次のようになります。例外をRuntimeExceptionに拡張します。

catchあなたが望む任意のコードは、コードがそれをスローするかどうかを確認することができないため、メソッドが宣言する必要はありません。

+0

ありがとう、私は例外がチェックされたものだと思った。とにかく例外を投げるのが唯一の方法だと思いますか? –

+0

@AkashdeepSalujaメソッドが実行されなかったことを呼び出し側に知らせるためには、スロー例外が例外です。 – Andreas

+0

@AkashdeepSalujaそれはまさに問題です。例外はチェックされたものです。あなたのメソッドは例外をスローすると宣言しません。したがって、コンパイラはこのチェック例外をキャッチすることを許可しません。スローされることは決してありません。なぜなら、throws節で宣言されていないからです。しかし、メソッド呼び出しをインターセプトするアスペクトは、メソッドのthrows節で宣言されていないチェック例外をスローすることによってメソッドの規約を破ります。コンパイラは、メソッドが実行時にそのように傍受され、その契約に違反していることを知ることはできません。 –