当前位置: 首页 > article >正文

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

在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);
        }

    }
}

http://www.kler.cn/a/299569.html

相关文章:

  • AI编程:如何编写提示词
  • Redis篇 Redis如何清理过期的key以及对应的解决方法
  • 【ESP32】ESP-IDF开发 | WiFi开发 | TCP传输控制协议 + TCP服务器和客户端例程
  • 【自学笔记】计算机网络的重点知识点-持续更新
  • Chrome浏览器编译系统研究与优化分析
  • Java 知识速记:全面解析 final 关键字
  • 【Python报错已解决】 raise JSONDecodeError(“Expecting value“, s, err.value) from None
  • 编程环境常用命令合集
  • 可提示 3D 分割研究里程碑!SAM2Point:SAM2加持泛化任意3D场景、任意提示!
  • 前端文件预览,PDF,word,TXT
  • 项目日志——日志落地模块的设计、实现、测试
  • windows上.chm文件打不开
  • 【Hot100】LeetCode—139. 单词拆分
  • 苹果三款Mac新品十月登场:标配M4系列芯片
  • mysql学习教程,从入门到精通,MySQL WHERE 子句(10)
  • 【区块链通用服务平台及组件】ESGC 基准报告应用 | FISCO BCOS应用案例
  • kubeadm 初始化 k8s 证书过期解决方案
  • 跨部门SOP与统一知识库:打破信息孤岛,促进团队协作
  • Console函数的所有使用方式详解比较
  • Redis 缓存深度解析:穿透、击穿、雪崩与预热的全面解读
  • 如果 Android 手机出现数据丢失,如何在Android上恢复丢失的数据
  • 蓝光3D扫描仪用于小尺寸精密注塑零件三维检测
  • HarmonyOs 应用基础--ArkTS-核心-基础
  • 深入掌握大模型精髓:《实战AI大模型》带你全面理解大模型开发!
  • JVM、JRE和 JDK:理解Java开发的三大核心组件
  • 内衣专用洗衣机怎么样?五款高分热门产品汇总,亮点满满