2017-01-30 19 views
2

hereからのものですが、例外処理についてはわかりません。 MSDNはフリーリストの方法を示しています。もう1つは大丈夫ですか?短く、同じ出力を生成する必要があります。ベストプラクティスの例外処理

質問:副作用なしに2番目の方法を使用できますか?

try 
{ 
    string s = null; 
    ProcessString(s); 
} 
catch (ArgumentNullException e) 
{ 
    LogError(e.Message); 
} 
catch (Exception e) 
{ 
    LogError("Error"); 
} 

または

try 
{ 
    string s = null; 
    ProcessString(s); 
} 
catch (Exception e) 
{ 
    LogError((e is ArgumentNullException) ? e.Message : "Error"); 
} 
+0

結果はどちらも同等です。しかし、あなたはベストプラクティスを求めています。だから両方とも "エラー"という表現の背後にある情報を隠しているのでどちらも悪いです。 – Ralf

+0

'SomeWeirdException'がスローされたらどうなりますか?ログに "* crystal ball *"を使って何が間違っているのかを理解するための "Error"レコードを記録するだけです... –

+0

@Toshi:異なるコードで同じように実現します。 – Ralf

答えて

1

まず第一に、あなたは、未知の例外が非常に悪い習慣である持っているとき、「エラー」の文字列をログに記録します。エラーの詳細(メッセージ、内部例外など)を記録する必要があります。そのため、ロギングフレームワークは、ログに記録されるオブジェクトExceptionを受け入れるメソッドを提供します。

次に、は、別のタイプの例外をキャッチする必要があります。違いがある場合は、を別様に処理する必要があります。あなたのケースであり、単純なエラーログは、どちらの場合もあるので、あなたが他の例外からArgumentNullExceptionを区別する必要はありません。

try 
{ 
    ProcessString(null); 
} 
catch (Exception e) 
{ 
    LogError("Failed to process string", e); 
} 

そして最後に - あなた自身のロギングフレームワークを書いていない - NLog上を見て、 log4netなど


また、通常、ハイレベルの例外のみを処理する必要があることに注意してください。例えば。何らかのビジネス操作を実行しようとしているときにArgumentNullExceptionまたはIndexOutOfRangeExceptionがある場合、これらの低レベルの例外をユーザーに表示することは好ましくありません。あなたは通常、カスタムハイレベルの例外(例えばDataMigrationException)でそれらをラップし、答えは本当に「それは依存」である

+0

@Toshi等しく行動することはどういう意味ですか? –

+0

同じ入力で同じ出力が生成される – Toshi

+0

LogErrorはユーザーの表示方法でもあり、私は彼に 'ArgumentNullException'を表示したいだけです – Toshi

0

後でそれらを扱います。

それはそれほど悪くはありませんが、より具体的な例外が優れています。より具体的に言えば、アプリケーションが実際に何をしようとしているのか、より具体的に理解していることを意味します。あなたは本当に期待している例外を処理し、他のすべてをバグとして扱うべきです。

コードブロックまたはメソッドがスローする可能性のある例外をキャッチしている場合は、ログに記録するのではなく、実際に回復する可能性が高くなります。