2011-11-10 4 views
6

より正確な再スローは本当にスローされた例外をスローするコードを記述することができます:のJava 7の正確な再スローとレガシーコード

public void foo(String bar) throws FirstException, SecondException { 
    try{ 
     // Code that may throw both FirstException and SecondException 
    } 
    catch (Exception e){ 
     throw e; 
    } 
    } 

前のJava 7にあなたが書かなければならなかった:

public void foo(String bar) throws Exception { 
    try{ 
     // Code that may throw both FirstException and SecondException 
    } 
    catch (Exception e){ 
     throw e; 
    } 
    } 

マイ質問:「Exception」を「FirstException, SecondException」に置き換えるために不正確なスローを検出するツールがありますか?

これまでのところ、私はEclipseにコンパイラの警告がないことを確認しました。 FindBugsやCodeProにはルールはありません。

+0

あなたの質問に次の文章を追加することをお勧めします: "私の目標は..."あなたの目標が間違っていると推測しているので、これまであなたは良いアドバイスを受けていません。 –

+1

私はその質問が非常に明確だと思います:余りにも広範な例外をスローするように怠惰に書かれたレガシーコードを更新するには、新しい便利なJava7構文を使用して更新できるようにそのようなコードを見つけるツールがあります。 – Thilo

答えて

-2

スローする前に例外をキャストしてみてください。おそらくトリックを行いますか?

public void foo(String bar) throws FirstException, SecondException { 
    try{ 
    // Code that may throw both FirstException and SecondException 
    } 
    catch (Exception e){ 
    throw ((e instanceof FirstException) ? (FirstException)e : (SecondException)e); 
    } 
} 

ところで、同じ例外を再スローすることは私にはかなり不器用なことをするようです...

+2

要点は、Java 7では**不要**です: 'throws FirstException、SecondException' **と**単純な' throw e'を使うことができます。 –

1

私は「過度に広範な」例外は必ずしも問題ではありませんので、これは、コンパイラの警告のための状況ではないと思います:メソッドがfinalまたはprivateの場合を除き、サブクラスの実装がどのような種類の例外をスローできるかを定義します。その場合、広い範囲が意図的であった可能性があります。

あなたの質問はJavaの前7のためにも等しく適用されるであろう:

ここ
public void foo(String bar) throws Exception { 
    // Code that may throw both FirstException and SecondException 
} 

throws Exceptionも悪い習慣と考えられる(ただし、それについては警告はありません)。引数の同じラインに沿って

、あなたはおそらくスローされることはできませんが、すべてのメソッドシグネチャのthrows句に追加することができます(チェック)例外をキャッチしようとすると、コンパイルエラーを取得することに注意してください実装体が使用しない例外の種類。

FindBugsのようなツールは役に立ちます。


アップデート:「メソッドが最終またはプライベートでない限り」:私は警告があるかもしれません(あまりにも、そしておそらく静的なもの)は、プライベートまたは最終メソッドのことに同意する必要があります。

更新2:最終的な方法であっても、オプションを開いたままにしておけば、今後インターフェイスを壊さずにさらに例外をスローすることができます。