[ヒント] [C#]重量例外(例外)のをスローする正しい方法

正しい量のスロー例外(例外)の方法


序文

最近レビュープロジェクトのプログラムでは、(左下に表示)を直接スロー例外をキャプチャするために、キャッチをしようとする状況を発見し、実際には、このアプローチは適切ではありません。より良いアプローチのような重いキャスト投げる例外を使用することです(図に示すように右下)。両方の違いを作ったもの最後に、以下の簡単な例について説明します。

画像   画像

デフ

我々は、すべてのデバッグ操作を容易にするために、キャプチャ例外の時に、コールスタック情報が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#]重量例外(例外)を投げるための正しい方法の


おすすめ

転載: www.cnblogs.com/chinatrump/p/11518129.html