0

私が取り組んでいるプロジェクトでは、次のようなブロックがいくつかあります。

クラスA:

try {
   callSomeMethod();
}
catch (Exception e) {
   throw new SomeCustomExceptionTypeForMetrics("");
}

ただし、一般的な例外をキャッチするすべてのインスタンスを、特定の「予期される」タイプの例外のみに置き換えるという任務がありました。

問題は callSomeMethod() がこのようなものを持っていることです

クラス B:

try {
    if (someCondition...) {

    }
    else {
       //failed
       throw new RuntimeException("Timeout while waiting for results")
    }
}
catch(InterruptedException e) {
   // do some failure stuff here
   throw new RuntimeException("Something here");
}

理想的には、私のグループは変更をできるだけ少なくするように私に依頼しました。また、callSomeMethod() の署名を変更することはできませんが、クラス A で RuntimeException をキャッチしたくないため、単にキャッチすることも望んでいません。任意のタイプの RuntimeException - クラス B から除外しているもののみ。

これを処理する最善の方法は何ですか?

4

2 に答える 2

0

以下のようにクラス B のコードを変更した場合

try {
        if (someCondition...) {

        }
        else {
           //failed
           throw new MyRuntimeException("Timeout while waiting for results")
        }
    }
    catch(InterruptedException e) {
       // do some failure stuff here
       throw new MyRuntimeException("Something here");
    }

MyRuntimeException を次のように定義します。

class MyRuntimeException extends RuntimeException{
..
}

クラス A では、 MyRuntimeException 例外をキャッチするだけで済みます。

これで問題が解決することを願っています!!

于 2016-05-11T16:11:26.353 に答える
0

Supposing that your callSomeMethod's signature contains throws Exception, and you can't change it: Change the RuntimeExceptions in the method to a custom Exception class, and then in Class A:

try {
   callSomeMethod();
}
catch (Exception e) {
   if(e instanceof CustomException)
       //Log it or something, for metrics?
}

This is kind of silly, but might be necessary if you can't change the method signature. (If you can change it, you could catch the CustomException directly.) You could even make a method in your logger that takes an Exception, checks what type it is, and acts accordingly. Then just use this method in every catch statement that you need to edit.

While designing this solution, keep in mind that RuntimeExceptions don't need to be caught. It could save you some trouble.

于 2016-05-11T16:10:42.007 に答える