優れている点とその理由:
これ
public void Main()
{
SomeMethod();
}
public void SomeMethod()
{
try
{
// code
}
catch(Exception)
{
}
}
またはこれ:
public void Main()
{
try
{
SomeMethod();
}
catch(Exception)
{
}
}
優れている点とその理由:
これ
public void Main()
{
SomeMethod();
}
public void SomeMethod()
{
try
{
// code
}
catch(Exception)
{
}
}
またはこれ:
public void Main()
{
try
{
SomeMethod();
}
catch(Exception)
{
}
}
答えは、「処理方法を知っている最低レベルで例外をキャッチする」です。
発生する場所に最も近い(つまり、コールスタックのできるだけ高い/適切な)例外をキャッチする必要があるという考えがあります。包括的例外ハンドラーは、使用可能な制御フローを大幅に減らすため、通常はお勧めできません。粗粒度の例外処理は非常に重要ですが、プログラムの安定性に対する合理的な解決策ではありません。残念ながら、多くの初心者開発者はそれが正しいと考えており、この包括的なtry-catchステートメントのようなアプローチを採用しています。
これを言って、プログラムの残りの部分で例外処理を適切に(きめ細かくタスク固有の方法で)利用し、それに応じて(一般的なエラーボックスを表示するだけでなく)そこでエラーを処理した場合は、一般的な試み-Mainメソッドのすべての例外をキャッチすることは、おそらく便利なことです。ここで注意すべき点の1つは、このメインのtry-catchでバグが検出された場合は、ローカライズされた例外処理にバグがあるか、何か問題があることです。
Mainでのこのtry-catchの主な使用法は、非常に異常な状況でプログラムがクラッシュするのを防ぐためだけであり、(漠然と)ユーザーフレンドリーな「致命的なエラー」メッセージをユーザーに表示するか、単に空白のままにし、エラーをどこかに記録したり、バグレポートを送信したりすることもできます。
クレジット:ノルドール
C#での例外処理のガイダンスについては、 「例外と例外処理(C#プログラミングガイド)」を参照してください。AndersHejlsbergへのこのインタビューも有益です。
ここでの関連ガイドラインは次のとおりです。
例外を処理してアプリケーションを既知の状態のままにできない限り、例外をキャッチしないでください。
通常、例外は適切に処理できない限りキャッチされるべきではありません。これは、コーディング内容に応じて、Mainまたはのいずれかになります。SomeMethodたとえば、Main一般的な例外を処理するための一般的なcatchステートメントを含めることができます(たとえば、コンソールにエラーメッセージを書き込みます)。ただしSomeMethod、特定の例外から回復してそれらをキャッチできる場合があります。
一般的に、catch {}(飲み込むことを除いて)避けるべきです。例外を処理できない呼び出し元は、単に例外を上向きに伝播できるようにする必要があります。
どちらが優れているというルールはありません。どちらの方法も使用できます。内部で例外をスローする可能性が最も高いコードが必要でありtry、これはすべてのプログラミング言語に適用されます。
カスタマイズは、最も理解しやすい例外を最低レベルでスローするための最良の方法になると思います。
最初にカスタム例外クラスを定義します
public class SomeException : Exception {}
public void SomeMethod()
{
try
{
// code
}
catch(Exception e)
{
throw new SomeException ("an error in somemethod",e);
}
}
これで、どこでもより明確に例外をキャッチできます。
次に起こるとしましょう:
失敗ごとに有効なメッセージが必要です。
public void Main()
{
try
{
SomeMethod();
}
catch(Exception)
{
}
}
上記は、それぞれtryの内部SomeMethod()をキャッチするよりも情報が少ないため、違いはありませんが、エラーの原因に関する有用なデータを提供するために、失敗する可能性のある小さなアクションをキャッチすることをお勧めします。
私の意見では、SomeMethod が上に行く前に例外をキャッチし、目にすぐにコードが表示されないために失われる可能性があります。
非常に重要なことの 1 つは、何よりもまず特定の例外をキャッチするようにしてください。
例えば
SomeMethod が文字列から数値への変換を行っている場合は、最初に FormatException をキャッチし、それ以外の例外クラスを配置してみてください