2007年06月20日

AppDomain.UnhandledException

  
どうも、昔調べたときと、例外処理の動作が変わっているみたいだ。
なので、再度調べなおしてみる。

まずは、MSDNドキュメントの「AppDomain.UnhandledException イベント」のページにあるサンプルを参考に、以下のコードを書いてみた。(まあ、ほとんど同じコードだけど)


using System;
using System.Security.Permissions;

public class Test {

[SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.ControlAppDomain)]
public static void Example() {
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);

throw new Exception("2");

}

static void MyHandler(object sender, UnhandledExceptionEventArgs args) {
Exception e = (Exception) args.ExceptionObject;
Console.WriteLine("MyHandler caught : " + e.Message);
}

public static void Main() {
Example();
}
}

実行すると、確かに制御が MyHandlerに行っているので、一応UnhandledExceptionイベンの処理は出来ているのだが、その後がいけない。

例の

「問題が発生したため、ConsoleApplication1 を終了します。 ご不便をおかけして申し訳ありません。」

というダイアログが出て、これを閉じると、コンソールに、

「ハンドルされていない例外: System.Exception: 2 ...」

というメッセージが表示されてしまう。どこが悪いのかさっぱりわからない。これってバグですか?
しかたないので、

Main() メソッドで、try-catch で、すべての例外を捕まえることにした。

 public static void Main() {
try {
Example();
} catch ( Exception ex ) {
Console.WriteLine("処理されていない例外: " + ex.Message);
}
}

コンソールアプリなんだし、こっちのほうが素直なコードだな。
ということで、これ以上深入りするのは辞めた。


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/50836172