0

このコード ブロックでは、特定の種類の例外に関する情報が失われると思います。次のコードを含むメソッドに一般的な Exception throws 句を追加する必要がないように、Exception の型を保持するにはどうすればよいですか? ジェネリックを正しく採用することと関係があると思います。ガイダンスをいただければ幸いです。

for( int i = 0; i < retries; i ++ ) {
    Exception anyException = null;
    try {
        Future<Object> returnedObj = threadPool.submit(task);
        toReturn = returnedObj.get(timeout, timeunit);
        break;
    } catch (RejectedExecutionException ex) {
        anyException = ex;
    } catch (NullPointerException ex ) {
        anyException = ex;
    }
    ...
    finally {
       ...
       if(i == retries -1 && anyException != null) {
           throw anyException;
       }
    }
}
4

4 に答える 4

3

あなたのコードはひどく壊れているとだけ言っておきます。finally ブロックからスローしないでください。try ブロックが、明示的にキャッチした 2 つの例外以外の例外をスローする場合、この例外がマスクされ、代わりにanyExceptionがスローされるリスクがあります。これにより、チームメンバーがあなたに復讐を計画したくなるようなステルスのバグが作成されます.

例外のタイプに関しては、どちらもチェックされていないため、メソッドの署名に関する問題は発生しません。宣言せずに投げるだけです。

于 2013-08-01T16:22:29.483 に答える
1

これがあなたがやろうとしていることだと思います:

try {
    Future<Object> returnedObj = threadPool.submit(task);
    toReturn = returnedObj.get(timeout, timeunit);
    break;
} catch (Exception ex) {
   if(i == retries -1) {
       throw ex;
   }

最初の N 個の例外をキャッチし、最後の例外のみを再スローします。このようにキャッチして再スローしても、型情報は失われません。基本クラスの 'Exception' でキャッチするということは、考えられるすべての型に対して同じコードを繰り返す必要がないということです。ただし、メソッドで「スロー例外」を回避したい場合は、タイプごとに複数のキャッチ/再スローが必要になります。誰かが指摘したように、現在キャッチしているものはチェックされていないため、メソッド署名で宣言しなくても問題なくスローできます。

このような例外を飲み込むのは得策ではないと言わざるを得ません。少なくともどこかに記録してください...

于 2013-08-01T16:33:58.647 に答える
0
if (anyException instanceOf RejectedExecutionException) {
  throw (RejectedExecutionException) anyException;
}
else if (anyException instanceof NullPointerException) {
  throw (NullPointerException) anyException;
}
于 2013-08-01T17:00:49.750 に答える