C# 開発

C# トラップされていない例外を制御する

準備

(なし)

デザイン

  • フォーム (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)

-C# 開発