首页 > 其他分享 >在WinForm中使用全局异常捕获处理

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

时间:2024-09-11 12:24:10浏览次数:9  
标签:Exception string 捕获 Application UnhandledException error 全局 异常 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);
        }

    }
}

标签:Exception,string,捕获,Application,UnhandledException,error,全局,异常,WinForm
From: https://www.cnblogs.com/ouyangkai/p/18408045

相关文章

  • PointNet++改进策略 :模块改进 | x-Conv | PointCNN, 结合局部结构与全局排列提升模型性
    目录前言PointCNN实现细节1.XXX-Conv操作输入输出步骤2.PointCNN网络架构层级卷积分类与分割任务......
  • git设置全局钩子函数检查commit-message
    步骤1、创建一个文件夹保存钩子文件,如"D:\softwares\Git\git-hooks"2、设置全局钩子函数地址:gitconfig--globalcore.hooksPath"D:\softwares\Git\git-hooks"3、编写prepare-commit-msg文件下面的commit-msg只能以[ADD],[MOD],[BUG]开头#!/bin/sh######校验提交信息......
  • 鸿蒙系统(HarmonyOS)全局弹窗实现
    全局弹窗相对于自定义弹窗有以下优点:封装更彻底,一行代码就能调用跟组件耦合度低,只需要传入组件的UIContext对象,不需要跟自定义弹窗一样需要在组件内部实例化CustomDialogController对象全局弹窗是鸿蒙在API12增加的,PromptAction对象增加了openCustomDialog方法。代码实现......
  • Winform C# 窗体应用程序简单入门
    搬运来源:https://blog.csdn.net/weixin_46262993/article/details/104169982?spm=1001.2014.3001.5502一、什么是Winform?WinForm是WindowsForm的简称,是基于.NETFramework平台的客户端(PC软件)开发技术,一般使用C#编程。C#WinForm编程需要创建「Windows窗体应用程序」项目......
  • 【vue+el-table】表格操作列宽度跟随按钮个数自适应, 方法封装全局使用
    效果图以上图片分别代表不同用户权限下所能看到的按钮个数,操作列宽度也会自适应宽度,就不会一直处于最大宽度,导致其他权限用户看到的页面出现大量留白问题.目录解决方法解决过程中可能出现的问题width赋值时为什么不放update()中btnDom为什么不能直接调用for......
  • java如何定义一个全局变量(内存中)
    前言java如何定义一个全局变量(内存中),项目启动时,通过读取配置文件来构建一个实体类对象,然后在之后可以直接使用,而不是每次使用都要进行构建前置准备实体类结构packagecn.daenx.demo;importlombok.Data;@DatapublicclassPerson{privateStringinfo;}配置文件......
  • Matlab 声波黑洞捕获波:同时减少声音反射和传播(APL文章)
    参考文献:[1]MiY,ZhaiW,ChengL,etal.Wavetrappingbyacousticblackhole:Simultaneousreductionofsoundreflectionandtransmission[J].AppliedPhysicsLetters,2021,118(11):114101-. DOI:10.1063/5.0042514.        在许多应用中,以行波形......
  • PLC结构化文本(ST)——异常捕获(__TRY__CATCH)
    PLCStructuredTextObjectOrientedProgrammingPLC结构化文本(ST)——异常捕获(__TRY__CATCH)异常处理异常是在程序执行期间出现的问题。C#中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。---C#......
  • 17 Python异常处理(捕获异常、抛出异常、自定义异常)
    本篇是Python系列教程第17篇,更多内容敬请访问我的Python合集当我们编写代码时,可能会遇到各种各样的错误情况,比如除数为零、找不到文件、网络问题等等。为了优雅地处理这些问题,Python提供了异常处理机制。1异常处理的基本结构Python中的异常处理主要依赖于try和ex......
  • [C++#33][异常] 错误码 | 抛出与捕获 | 异常安全 | 异常体系
    目录C语言与C++错误处理方式的对比及应用一、C语言传统的错误处理方式1.终止程序:assert2.返回错误码缺点:二、C++中的异常处理机制1.基本概念2.异常的抛出与捕获3.异常的重新抛出三、C++中的异常安全1.构造函数与析构函数的异常2.RAII(资源获取即初始化)3.使......