だらだらやるよ。

こげつのIT技術メモ

C#でtry-catch文を書いていないところで起きた例外を取得する。

例外処理ってきちんと書いているつもりでもうっかり書き忘れたりするんですよね。
C#Javaみたいに例外処理を強制するような仕組みがあればいいなぁとたまに思うのですが。
あとはほんとにどこで起きてるか良くわかんない例外をキャッチして握りつぶしたい!とか


まぁ、そんなわけで
これをどうにかしてあげないとアプリがクラッシュしてしまうのでこんな感じで対処しましょう。

		[MTAThread]
		static void Main() {
			AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
			Application.Run(new MainForm());
		}
		static void CurrentDomain_UnhandledException(object sender,UnhandledExceptionEventArgs e) {
			try {
				Exception ex = (Exception)e.ExceptionObject;
				using(StreamWriter writer = new StreamWriter("exception.txt",true)) {
					writer.WriteLine("BEGIN-------------------------------------------");
					writer.WriteLine(string.Format("UnhandledExecption {0}",DateTime.Now.ToString()));
					writer.WriteLine(ex.StackTrace);
					writer.WriteLine("------------------------------------------------");
					writer.WriteLine(ex.ToString());
					writer.WriteLine("END---------------------------------------------");
				}
				MessageBox.Show(
					"エラー","例外",
					MessageBoxButtons.OK,MessageBoxIcon.Hand,MessageBoxDefaultButton.Button1);
			} catch(Exception) {
			}
		}

上記のコードと同じように、Application.ThreadExceptionにもイベントを設定してあげる必要があるのですが
WindowsMobileにはThreadExceptionのイベントがないので、
僕がWMアプリを作るときはUnhandledExceptionだけ設定しています。
メッセージボックスを出すかどうかはお好みで、適当に処理しましょう。


情報源は@ITとかオライリーC#本とか
適切に処理されなかった例外をキャッチするには?:.NET TIPS - @IT