正しい量のスロー例外(例外)の方法
序文
最近レビュープロジェクトのプログラムでは、(左下に表示)を直接スロー例外をキャプチャするために、キャッチをしようとする状況を発見し、実際には、このアプローチは適切ではありません。より良いアプローチのような重いキャスト投げる例外を使用することです(図に示すように右下)。両方の違いを作ったもの最後に、以下の簡単な例について説明します。
デフ
我々は、すべてのデバッグ操作を容易にするために、キャプチャ例外の時に、コールスタック情報がException.StackTraceプロパティから取得することができることを知っているし、エラーが発生した場所を正確に見つけます。以下は、情報の整合性の点で両者の違いを探求します。
まずは、テストを行うために、コールスタックのクラスを確立するためにプッシュしてみましょう。あなたがAoo.DoSomethingInBooを呼び出すと()メソッドは、ブー、クー、ドゥーのDoSomethingInXoo()メソッドに順次行われ、最終的に故意にDoo.DoSomethingInDoo()でエラーが発生し、その後、Boo.DoSomethingInBooに引き渡されます()この例外をキャプチャしますエラー、および元スローを投げるか、違いを終了する二コールに例外をスローします。
次のようにキャッチ例外エラースタックトレース情報が画面上に印刷した後にメインプログラムは、試験の終了を呼び出します
EXを投げます
実装を見て、スローEXを使用して例外をスローする最初の
私たちはスローEXを使用する場合、それはコールスタックをリセットし、例外の発生の正確な位置の損失が発生します。データのみのStackTrace Boo.DoSomethingInBoo(に設けられているのに対し、Doo.DoSomethingInDooにおけるエラー発生箇所が(、)明らかに、以下に示すように)ので、最後にこの上の単一のメッセージがクラスメソッドで発生した実際のエラーを認識していません、それは多大な苦痛の原因となります。
スロー
そして、実装を見て、例外をスローするようにスローを使用
スロー投げエラーを使用して、コールスタックをリセットしません、完全なスタックトレース情報を保持し、例外を発生しデバッグするためのアクセスポイントを促進します。以下に示すように、明確に)(Doo.DoSomethingInDooのエラー箇所を示し、完全なコールスタック情報を取得します。
ここでは、完全なテストコードがあり、興味の友達ができ、セルフテスト
namespace RethrowExceptionConsole
{
class Program
{
static void Main(string[] args)
{
try
{
Aoo aoo = new Aoo();
aoo.DoSomethingInAoo();
}
catch (Exception ex)
{
// display stack trace info
Console.WriteLine( "----- stack info -----" );
Console.WriteLine( ex.StackTrace.ToString() );
Console.WriteLine( "----------------------" );
}
Console.Read();
}
}
// level 1
public class Aoo
{
public Boo boo = new Boo();
public void DoSomethingInAoo()
{ boo.DoSomethingInBoo(); }
}
// level 2
public class Boo
{
public Coo coo = new Coo();
public void DoSomethingInBoo()
{
try
{
coo.DoSomethingInCoo();
}
catch (Exception ex)
{
// log here
// ...
// ## Rethrow exception ##
// destroys the strack trace info!
//throw ex;
// ## Rethrow exception ##
// preserves the stack trace
throw;
}
}
}
// level 3
public class Coo
{
public Doo doo = new Doo();
public void DoSomethingInCoo()
{ doo.DoSomethingInDoo(); }
}
// level 4
public class Doo
{
public void DoSomethingInDoo()
{
int i = 0;
i = 1 / i; // cause exception
}
}
}
私はこの記事が必要としている人々に役立つことを願って
内容が間違っているか、他の提案がある場合は、作者ああにメッセージを残すこと自由に感じなさい!
オリジナル:大列 [ヒント] [C#]重量例外(例外)を投げるための正しい方法の