4

進取の気性に富んだ Java プログラムでは、次のようなパターンがよく見られます。

public Something myMethod() throws MyException {
    try {
        // may throw checked DbException:
        Connection c = openDataBase("connectionstring");
        // ... other code throwing more checked exceptions ...
    } catch(DbException e) {
        throw new MyException(e);
    }
    return something;
}

...または、メソッドヘッダーで宣言されてない1つのチェック済み例外タイプを「キャスト」する他のメカニズム。多くの場合、この「try-catch-cast」ブロックは、そのようなクラスのすべてのメソッドに入れる必要があります。

例外をキャッチして変換するアノテーションをどのように実装するのだろうか?

using コードは次のようになります。

@ConvertException(MyException, DbException)
public Something myMethod() throws MyException {
    // may throw checked DbException:
    Connection c = openDataBase("connectionstring");
    // ...
    return something;
}

もちろん、MyException.classまたは"MyException"代わりに書く必要があるかもしれません。これらの注釈を連鎖させたり、変換する複数の例外をリストしたりすることも可能でなければなりません。

私の推測では、注釈は、元の関数を呼び出すキャッチ コード ブロックを含むラッパー関数を導入します。その場合、注釈にはコンパイル時保持のみが含まれます (実行時保持はありません)。

これを行うのが賢明だとは言いません。おそらく、これらの注釈がプログラムのセマンティクスを変更するためではありません。「ただ学ぶ」というのは学術的な問題かもしれません...

4

2 に答える 2

3

注釈は、それ自体では何もしません。それらを評価し、それに応じてコードを変更するツールが必要です。

あなたの場合、AspectJ が最適なようです。

私のアドバイスは、Ramnivas Laddad による AspectJ in Action (第 2 版) を読むことです

目次からわかるように、例外のソフト化に関する章が含まれています。これは、ほぼ正確に必要なものです。

この質問dependency-injectionにタグを付けたので、Spring を使用すると仮定すると、ここに Spring 独自の例外変換メカニズムがあります

于 2012-08-13T08:04:39.570 に答える
0

はい、これは、コンパイラ ツリー API (パッケージ) を使用してコンパイル中にソース コードを操作する注釈プロセッサを作成することで可能になるはずです。javac.tree

もちろん問題は、コードがコンパイルされるたびにこのアノテーション プロセッサが存在しなければならず、ソース コードを処理する多くのツール (最も顕著な IDE) がそれを認識せず、コードが無効であると見なす可能性があることです。

于 2012-08-13T08:06:25.440 に答える