在WinForm中使用全局异常捕获处理

在WinForm中使用全局异常捕获处理 中使用全局异常捕获处理 WinForm Form Win

在WinForm中使用全局异常捕获处理

在WinForm应用程序中,全局异常捕获是确保程序稳定性的关键。通过在Program类的Main方法中设置全局异常处理,可以有效地捕获并处理未预见的异常,从而避免程序崩溃。

注册全局异常事件

[STAThread]
static void Main()
{
    // 注册全局异常捕获事件
    Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    // 启动应用程序
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new MainForm());
}

处理未捕获的异常并记录日志

在全局异常事件处理方法中,我们可以编写逻辑来处理异常,例如记录日志、显示错误消息等。

// 处理未捕获的异常并记录日志
private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
    // 处理异常,如记录日志、显示错误消息等
    Exception exception = e.Exception;
    // ToDo: 处理异常的逻辑代码

    // 关闭应用程序或显示错误信息
    // Application.Exit();
    // MessageBox.Show("发生错误:" + exception.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

// 处理未捕获的异常并记录日志
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    // 处理异常,如记录日志、显示错误消息等
    Exception exception = e.ExceptionObject as Exception;
    // ToDo: 处理异常的逻辑代码

    // 关闭应用程序或显示错误信息
    // Application.Exit();
    // MessageBox.Show("发生错误:" + exception.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

示例代码

using System;
using System.Windows.Forms;
using exeStartTool;

namespace CopyTest
{
    internal static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        private static void Main()
        {
            //处理未捕获的异常
            //Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
            //ThreadException 处理UI线程异常
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
            //UnhandledException 处理非UI线程异常
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

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

        static void Application_ThreadException(object sender,System.Threading.ThreadExceptionEventArgs e)
        {
            string str = "";
            string strDateInfo = "\r\n\r\n出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";
            Exception error = e.Exception as Exception;
            if (error != null)
            {
                string logInfo = string.Format(strDateInfo + "异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n",error.GetType().Name,error.Message,error.StackTrace);
                str = string.Format(strDateInfo + "异常类型:{0}\r\n异常消息:{1}\r\n",
                error.GetType().Name,error.Message);
            } else
            {
                str = string.Format("应用程序线程错误:{0}",e);
            }

            MessageBox.Show(str,"系统错误",MessageBoxButtons.OK,MessageBoxIcon.Error);
        }

        static void CurrentDomain_UnhandledException(object sender,UnhandledExceptionEventArgs e)
        {
            string str = "";
            Exception error = e.ExceptionObject as Exception;
            string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";
            if (error != null)
            {
                string logInfo = string.Format(strDateInfo + "Application UnhandledException:{0};\n\r堆栈信息:{1}",error.Message,error.StackTrace);
                str = string.Format(strDateInfo + "Application UnhandledException:{0};\n\r",error.Message);
            } else
            {
                str = string.Format("Application UnhandledError:{0}",e);
            }

            MessageBox.Show(str,"系统错误",MessageBoxButtons.OK,MessageBoxIcon.Error);
        }

    }
}
评论