C# 入門 & 実践 / C sharp

4-24. 例外処理 - 2 - 独自の例外オブジェクトを作る。


1. 独自の例外オブジェクトを作成
2. catch 側でも分ける。
3. InnerException を使用する。

1. 独自の例外オブジェクトを作成


独自の例外オブジェクトは System.ApplicationException から派生して作成します!

BbException というクラスを作成して
Test() 内でスローさせてみます。

    class BbException : System.ApplicationException
    {
        // メッセージの始めにクラス名を付けてみただけ。
        public BbException(string msg):base( "BbException : " + msg)
        {
        }
       
    }
    class MyException
    {
        public void Test()
        {
            Console.WriteLine("Test() : メソッドが呼ばれました。");
            // エラーをスローします!
            // BbException を利用してみます!
            throw new BbException("エラーが出たよ");
        }

        static void Main()
        {
            try
            {
                MyException me = new MyException();
                Console.WriteLine("try : メソッドを呼び出します。");
                // エラーをスローさせます。
                me.Test();
                Console.WriteLine("try : メソッドは無事終了しました。");
            }
            catch( Exception e ) 
            {
                // Exception は全ての例外をキャッチします!
                Console.WriteLine("catch( Exception e) : エラーがスローされた.");
                Console.WriteLine("catch( Exception e) : {0}" , e.Message );
            }
            finally
            {
                Console.WriteLine("finally : try catch の全ての処理後に呼ばれます。");
            }
        }
    }

try : メソッドを呼び出します。
Test() : メソッドが呼ばれました。
catch( Exception e) : エラーがスローされた.
catch( Exception e) : BbException : エラーが出たよ
finally : try catch の全ての処理後に呼ばれます。

先ほどとほぼ同じですが、BbException : がメッセージの前に付いています。

2. catch 側でも分ける。



catch 句を一つ増やします

catch ( Exception e) は、すべての例外をキャッチしましたが
catch ( BbException e) は、BbException が投げられたときだけ処理を行います。

        static void Main()
        {
            try
            {
                MyException me = new MyException();
                Console.WriteLine("try : メソッドを呼び出します。");
                // エラーをスローさせます。
                me.Test();
                Console.WriteLine("try : メソッドは無事終了しました。");
            }
            catch ( BbException e)
            {
                // BbException
                Console.WriteLine("catch( BbException e) : BbException がスローされた! ");
                Console.WriteLine("catch( BbException e) : {0}", e.Message);
            }
            catch (Exception e)
            {
                // Exception は全ての例外をキャッチします!
                Console.WriteLine("catch( Exception e) : エラーがスローされた.");
                Console.WriteLine("catch( Exception e) : {0}", e.Message);
            }
            finally
            {
                Console.WriteLine("finally : try catch の全ての処理後に呼ばれます。");
            }
        }


3. InnerException を使用する。



Testで出た例外を保持したまま Test2 で新しい例外を投げます!
何重にも入れ子して while で呼び出しも可能。

    class BbException : System.ApplicationException
    {
        public BbException(string msg)
            : base("BbException : " + msg)
        {
        }
        // innerException を使う用。
        public BbException(string msg, Exception inner )
            : base( msg, inner )
        {
        }
       
    }
    class MyException
    {

        public void Test()
        {
            Console.WriteLine("Test() : メソッドが呼ばれました。");
            // エラーをスローします!
            // BbException を利用してみます!
            throw new BbException("エラーが出たよ");
        }

        public void Test2()
        {
            try
            {
                this.Test();
            }
            catch (Exception e)
            {
                string s = "Test2 でエラー : さらに innerException もあるよ!";
                BbException e2 = new BbException("Test 2 でエラーだよ。", e);
                throw e2;
            }
        }

        static void Main()
        {
            try
            {
                MyException me = new MyException();
                Console.WriteLine("try : メソッドを呼び出します。");

                // Test2 を呼んでみる。
                me.Test2();
                Console.WriteLine("try : メソッドは無事終了しました。");
            }
            catch ( BbException e)
            {
                // BbException
                Console.WriteLine("catch( BbException e) : BbException がスローされた! ");
                Console.WriteLine("catch( BbException e) : {0}", e.Message);
                Exception inner = e.InnerException;
                if (inner != null)
                {
                    Console.WriteLine("catch( BbException e) : InnerException : {0}", inner.Message);
                }
            }
            catch (Exception e)
            {
                // Exception は全ての例外をキャッチします!
                Console.WriteLine("catch( Exception e) : エラーがスローされた.");
                Console.WriteLine("catch( Exception e) : {0}", e.Message);
            }
            finally
            {
                Console.WriteLine("finally : try catch の全ての処理後に呼ばれます。");
            }
        }

try : メソッドを呼び出します。
Test() : メソッドが呼ばれました。
catch( BbException e) : BbException がスローされた!
catch( BbException e) : Test 2 でエラーだよ。
catch( BbException e) : InnerException : BbException : エラーが出たよ
finally : try catch の全ての処理後に呼ばれます。

ここでは、独自のクラスにしていますが、 InnerException は普通に Exception で使用できます。




4-23. 例外処理 - 1 - try catch finally « 4. C# 入門 Level 2 » 4-25. デリゲート と イベント - 1 - デリゲートって何ですか?


C# 入門 & 実践 / C sharp