4

ほとんどの静的コード分析ツールは、RuntimeExceptions や Errors などの一般的な (特にチェックされていない) 例外をキャッチしないことを提案しています。

この Exception バリアがトップ レベルで妥当でない限り、通常、それは下位レベルではありません。残念ながら、既存のコードを書き換え/修正する場合、これを実現するのは非常に困難です。これは、発生する可能性のあるエラーとランタイム例外の根本的な可能性が法外なものになる可能性があるためです。さらに、一般的なキャッチの代わりにキャッチするのに十分合理的な例外のいくつかのアイデアを得るために、より低いコードレベルを掘り下げることは、ほとんどの場合、本当に時間のかかる複雑なタスクです。

このような一般的な (チェックされていない) 例外をより具体的な例外に分解するためのツールやベスト プラクティスを知っていますか?

次のようなものがあるとします。

try
{
    somethingReallyComplex();
}
catch (RuntimeException | Error ex)
{
    Logger.error(this, ex.getClass().getName() + " while doing something really complex", ex)
}

try ブロックには、キャッチする意味のあるさまざまな異なる RuntimeExceptions と Errors を含む、非常に複雑なコードの問題を含めることができます。しかし、このコードを最も効果的に分析して、RuntimeException を NullPointerException、ArrayIndexOutOfBoundException に分解するにはどうすればよいでしょうか?

そのようなコードを分析し、そこにある最も一般的な RuntimeExceptions などについて提案できるツールはありますか?

この問題をどのように解決し始めますか?

主観的または客観的な「しきい値」はどこにありますか: 「いいえ、RuntimeException のままにして、suppress アノテーションを追加しますか?」

4

4 に答える 4

7

一般的な例外をキャッチする上で最も重要なことは、キャッチするかどうかではなく、どこでキャッチするです。呼び出しスタックの上位にある中央の場所、いわゆる例外バリアでそれを行う場合、それはまさにあなたがすべきことです。コードの途中、多かれ少なかれ恣意的なポイントでそれを行った場合、それは悪い習慣になります。

于 2012-07-25T17:10:06.543 に答える
2

立証責任はあなたではなく、コードの変更を要求するツールにあるべきです。合理的な静的分析ツールは、特定の警告の背後にある理論的根拠を提供し、特定の状況でその警告を無視した場合の影響を評価できるようにします。(ほとんどの警告は、常に問題があるからではなく、フラグを立てるコードに問題があることが多いために存在します。)

回復ロジックが非常に一般的であり、例外を区別する必要がないため、例外をキャッチすることが正しいことである状況が確かにあります。たとえば、次のようなものを実装する場合です。機能しなかった場合は、例外をログに記録し、ユーザーに通知して先に進みます。」それは、例外ハンドラが何をするかに大きく依存します。

于 2012-07-25T17:18:58.700 に答える
0

私の意見では、コードの各部分は、処理方法を知っている例外をキャッチする必要があり、スローされるすべてのチェック済み例外は、このコードに関連する意味を持つ必要があります。基本的なメカニズムは、処理されるすべての例外を、このメソッドがスローするチェック済み例外のタイプにラップすることです。この規則 (huhu) の例外は、RuntimeExceptions と、キャッチしようとしてはならないほとんどのエラーです (エラー javadocを参照)。

したがって、try{} ブロック内の各メソッドは、メソッドに関連する意味を持つチェック済み例外をスローする必要があります。そして、これらすべてのメソッドで同じことを再帰的に行いますが、それを行うのに十分なほどスマートなツールはありません。

于 2012-07-25T17:23:20.083 に答える
0

お勧めしませんが、通常は一般的な例外をキャッチしますが、結局のところ、ログに書き込んで先に進むだけです。

爆発したものに基づいてさまざまなクリーンアップ タスクを実行する必要がある場合は、try の後に 6 つまたはその他の catch ブロックを用意すると便利です。

于 2012-07-25T17:08:51.723 に答える