C# 開発

C# アプリケーション実行例外を捕捉する(AppException)

準備

(なし)

デザイン

  • フォーム (Form1) にテキストボックス (textBox1) を配置します。

サンプルコード (C#)

Class1.cs

using System.Text;

namespace WinFormsApp1
{
    static class Class1
    {
        static public void AppException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            var vsMessage = new StringBuilder();

            vsMessage.AppendLine("アプリケーションアクセス中に致命的なエラーが発生しました。");
            vsMessage.AppendLine(e.Exception.Message);
            vsMessage.AppendLine("");
            vsMessage.AppendLine("----- イベント -----");
            if (e.Exception.TargetSite is not null)
            {
                vsMessage.AppendLine(e.Exception.TargetSite.ToString());
            }
            vsMessage.AppendLine("");
            vsMessage.AppendLine("----- トレース情報 -----");
            vsMessage.AppendLine(e.Exception.StackTrace);

            MessageBox.Show(vsMessage.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Stop);
            string vsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            string vsFileName = $@"{vsPath}\ErrorLog{DateTime.Now:yyyyMMdd_HHmmss}.log";

            using (var sw = new StreamWriter(vsFileName))
            sw.WriteLine(vsMessage.ToString());

            Application.Exit();
        }
    }
}

Program.cs

namespace WinFormsApp1
{
    using static Class1;

    internal static class Program
    {
        [STAThread]
        static void Main()
        {
           Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(AppException);

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Form1.cs

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int x = 100;
            int y = 0;
            int z = x / y;
        }
    }
}

解説

アプリケーション実行時にクラッシュした場合は、通常はシステム固有のダイアログが表示されます。この場合、単にクラッシュして終わりです。アプリケーション例外を補足する処置を実行しておくと、任意のメッセージを表示させ、そのログを保存させることができます。

まず、Class1 で、AppException メソッドを作成します。アプリケーション例外が発生した際、このメソッドがコールされます。

Main メソッドで、アプリケーション例外が発生した際、AppException メソッドがコールされるよう設定します。

Form1 の button1 イベントが発生した際、0 で除算する箇所でアプリケーション例外が発生し、AppException メソッドがコールされます。

結果

実行時エラー(通常の場合)

実行時エラー(アプリケーション例外を補足した場合)

動作確認環境

Visual Studio 2022 Professional (.NET8 C#12)

ログ

初版:2024.03.05 Visual Studio 2015 Professional (C# 6.0)


							

-C# 開発