準備
(なし)
デザイン
- フォーム (Form1) にボタン (button1) を配置します。
サンプルコード (C#)
namespace WinFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(AppEx); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { throw new DivideByZeroException("ゼロでの除算でクラッシュしました。\r\n\r\nアプリケーションを終了します。"); } private void AppEx(object sender, System.Threading.ThreadExceptionEventArgs e) { MessageBox.Show(e.Exception.Message, "エラー"); Application.Exit(); } } }
解説
ゼロ除算に関する例外を意図的に発生させています。このようにトラップされていない例外が発生した時は、AppEx メソッドが実行されるように設定しています。これは、Form1 のコンストラクタで設定しています。
尚、この処理を開発環境で行うためには、Ctrl + F5 により、デバッグなしの実行をする必要があります。
旧 Visual Basic では、各関数の先頭で、 On Error を記述することにより、予期せぬエラーに対処することができました。.NET では、Try ... Catch により、同様のことができますが、ブロック構造により、どうしてもメインロジックが一階層下がってしまい、コードを記述する上では不便な面がありました。また、旧 Visual Basic と同じように全ての関数 (メソッド) に対して記述する必要があるため、コーディング量が増えてしまいます。しかし、今回この方法では、アプリケーション全体に渡って、例外が処理されるため、非常に効率がよい仕組みとなっています。
結果
動作確認環境
Visual Studio 2022 Professional (.NET 7 C#11)
ログ
初版:2016.06.08 Visual Studio 2015 Professional (C# 6.0)