|
分類:[C#]
2012/12/12(Wed) 01:04:14 編集(投稿者)
C#における例外処理について下記のプログラムにおける 下記質問の回答をお願い致します。 <質問@> (*1)についてSystem.ApplicationExceptionを削除し派生クラスにしないとビルドエラーになりますが 派生させないといけないということを単に覚えておくだけでよいのでしょうか? またコンストラクタの定義で: base("BbException : " + msg)や: base(msg, inner)は何を 指すのでしょうか?
<質問A> (*3)で"CallExceptionでエラーが出ました"の文字列と例外オブジェクトのeを (*2)のコンストラクタに渡してますが、こうすることで (*3)のBbException型のe2オブジェクトのmessageプロパティには "CallExceptionでエラーが出ました"の内容が格納されInnerExceptionプロパティで (*3)を発生させる原因になった(*4)のメッセージが格納されるという認識で よいのでしょうか?
<質問B> Exception.InnerExceptionは現在の例外を発生させた Exception インスタンスを取得と 目にしましたが、それは(*2)と(*3)の書き方をすることでExceptionインスタンスが Exception.InnerExceptionプロパティに格納されるということでしょうか? このように記述することで現在の例外を発生させた Exception インスタンスが格納 されることがイメージしにくいのでお手数ですが解説の程よろしくお願い致します。
class BbException : System.ApplicationException (*1) { public BbException(string msg) : base("BbException : " + msg) { } // innerException を使う用。 public BbException(string msg, Exception inner) (*2) : base(msg, inner) { }
} ------------------------------------------------------------ class MyException { public void Test() { Console.WriteLine("Test() : メソッドが呼ばれました。");
throw new BbException("エラーが出ました"); (*4) }
public void CallException() { try { this.Test(); } catch (Exception e) { BbException e2 = new BbException("CallExceptionでエラーが出ました", e); (*3) throw e2; } }
} ----------------------------------------------------- static void Main(string[] args) { try { MyException me = new MyException(); Console.WriteLine("try : メソッドの呼出し");
// Test2 を呼んでみる。 me.CallException(); 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 の全ての処理後に呼ばれます。"); Console.ReadLine(); }
}
|