首页 > 编程语言 >C# WinForm 添加全局统一的异常捕获并追踪到异常发生位置

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

时间:2024-12-05 09:48:33浏览次数:11  
标签:StackTrace C# frame 应用程序 Application ex 异常 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)
        {
            // 获取堆栈跟踪信息
            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(); // 这将终止应用程序
        }
    }

标签:StackTrace,C#,frame,应用程序,Application,ex,异常,WinForm
From: https://www.cnblogs.com/wofeiliangren/p/18587816

相关文章

  • AudioContext有什么应用场景?
    AudioContext在前端开发中有很多应用场景,主要围绕着处理和操作音频。以下是一些常见的例子:音频可视化:可以使用AudioContext的AnalyserNode来获取音频的频率和时间域数据,然后用这些数据来创建各种视觉效果,例如频谱图、波形图等,以响应音乐或其他音频的播放。游戏音效:可......
  • 说说position:sticky有什么应用场景?
    position:sticky在前端开发中有很多应用场景,它结合了position:relative和position:fixed的特性,允许元素在滚动到特定阈值时“粘住”在屏幕的某个位置。以下是一些常见的应用场景:导航栏:当页面向下滚动时,导航栏可以粘贴在屏幕顶部,方便用户快速跳转到不同页面或章节。......
  • 如何在易优EyouCms中设置附件上传的大小限制?
    在易优EyouCms中,如果您需要设置附件上传的大小限制,可以通过以下步骤进行操作:进入后台管理界面:首先,登录到易优EyouCms的后台管理界面。输入您的管理员账号和密码,进入后台管理系统。导航到附件设置页面:在后台管理界面的左侧菜单栏中,找到“系统”选项,并点击展开。在展开的......
  • 在易优EyouCms中,为什么后台保存某些设置后没有任何变化?
    如果您在易优EyouCms的后台保存某些设置后发现没有任何变化,这可能是由以下几个原因导致的:缓存问题:数据库表缓存:类似于栏目图片的问题,数据库表缓存可能导致设置未能及时生效。您可以尝试清空 \data\schema 目录下的文件,然后在后台进行缓存清理。具体操作方法是在后台管理界......
  • 当不在常用地或异地出差时,如何临时解决因安全锁白名单无法登录易优EyouCms的问题?
    当您不在常用地或异地出差时,可能会因为设置了安全锁白名单而无法登录易优EyouCms。这时,可以通过以下步骤临时解决这个问题:创建“uneyousafe.txt”文件:打开电脑上的记事本或其他文本编辑器。创建一个新的空白文件,文件名为“uneyousafe.txt”。确保文件内容为空。上传文件......
  • RocketMQ 如何保证消息不丢失(一)
    一、RocketMQ如何保证消息的不丢失​消息的流转是通过Producer发送消息到Broker,然后Consumer再到Broker上拉取消息。生产者:Producer发送消息消息队列:RocketMQBroker存储消息消费者:Consumer消费消息要保证消息不丢失,Producer需要保证消息一定完整的发送到Broker。Broker一定......
  • 用css画出一把刻度尺
    .ruler{width:300px;/*Adjustasneeded*/height:20px;background-color:#f0f0f0;border:1pxsolid#ccc;position:relative;}.ruler::before{content:"";position:absolute;top:0;left:0;width:100%;height:1......
  • 常用JavaScript 单行代码
    1.不使用临时变量来交换变量的值例如我们想要将a于b的值交换leta=1,b=2;//交换值[a,b]=[b,a];//结果:a=2,b=12.对象解构,让数据访问更便捷const{name,age}={name:'张三',age:23};//结果:name='张三',age=233.浅克隆对象......
  • ABB机器人3HAC036260-001驱动器维修看点
    ABB机器人驱动器是机器人运动控制系统的核心组件之一,负责为机器人提供必要的动力和控制信号,以确保其能够准确、稳定地完成各种工作任务。然而,由于长时间运行、环境因素或操作不当等原因,abb机械臂驱动器3HAC036260-001可能会出现各种故障,影响机器人的正常运行。常见故障及维修方法1......
  • 一个项目中有很多无用的css代码,怎么找到并清除这些无用的代码?
    在一个项目中找到并清除无用的CSS代码,有很多方法,可以根据项目的规模和复杂程度选择合适的策略:1.使用浏览器开发者工具:CoverageTab:现代浏览器(Chrome,Firefox,Edge)的开发者工具都带有Coverage功能。打开开发者工具,切换到Coverage标签页,然后重新加载页面。Coverage......