C# WinForm 添加全局统一的异常捕获并追踪到异常发生位置

1.应用程序级别的异常处理

​ 使用AppDomain.CurrentDomain.UnhandledException 事件,使用StackTrace获取到错误的堆栈跟踪信息

    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.SetCompatibleTextRenderingDefault(false);

            // 添加应用程序级别的未处理异常处理程序
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

            Application.Run(new Form1());

        }
        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            Exception ex = (Exception)e.ExceptionObject;


            // 获取堆栈跟踪信息
            StackTrace stackTrace = new StackTrace(ex, true); // 第二个参数 true 表示捕获文件信息
            StackFrame frame = stackTrace.GetFrame(0); // 获取第一个(最顶层的)堆栈帧

            // 获取文件名和行号
            string fileName = frame.GetFileName();
            int lineNumber = frame.GetFileLineNumber();

            // 这里你可以记录日志或显示一个错误对话框
            MessageBox.Show($"Unhandled exception: {ex.Message}\nFile: {fileName}\nLine: {lineNumber}");
            // 注意:这不会阻止应用程序终止
        }
    }
    }
}

2. UI 线程中的未捕获异常处理

对于 UI 线程中的未捕获异常,可以用Application.ThreadException 事件

{
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
 
            // 添加应用程序级别的未处理异常处理程序(如上所示)
 
            // 添加 UI 线程中的未捕获异常处理程序
            Application.ThreadException += Application_ThreadException;
 
            Application.Run(new MainForm());
        }
 
        private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
        {
             Exception ex = e.Exception;
            // 获取堆栈跟踪信息
            StackTrace stackTrace = new StackTrace(ex, true); // 第二个参数 true 表示捕获文件信息
            StackFrame frame = stackTrace.GetFrame(0); // 获取第一个(最顶层的)堆栈帧

            // 获取文件名和行号
            string fileName = frame.GetFileName();
            int lineNumber = frame.GetFileLineNumber();

            // 这里你可以记录日志或显示一个错误对话框
            MessageBox.Show($"Unhandled exception: {ex.Message}\nFile: {fileName}\nLine: {lineNumber}");
            // 如果不希望终止应用程序,可以注释掉下面的行
            Application.Exit(); // 这将终止应用程序
        }
    }
posted @ 2024-12-05 09:33  我本梁人  阅读(49)  评论(0编辑  收藏  举报