配置legacyUnhandledExceptionPolicy属性防止处理异常后程序崩溃退出(C#)

这篇具有很好参考价值的文章主要介绍了配置legacyUnhandledExceptionPolicy属性防止处理异常后程序崩溃退出(C#)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这是这篇文章后面遗留的问题:

winform中的全局异常信息_winform全局异常捕获_zxy2847225301的博客-CSDN博客

就是线程抛出异常后,被AppDomain.CurrentDomain.UnhandledException注册的事件捕获后,程序依旧崩溃退出。

解决方案:在app.config配置文件中的runtime节点中加上<legacyUnhandledExceptionPolicy enabled="1"/>

<runtime>
    <legacyUnhandledExceptionPolicy enabled="1"/>
    <!--<legacyCorruptedStateExceptionsPolicy enabled="true"/>-->
</runtime>

-------------------废话开始,可以跳过不看

趁着今天有空,就找找有没有对应的处理方案。

首先是翻看了现在所在公司的代码,使用的是winform程序,没找到对应的解决方案。再翻看上一家公司的代码,使用的是wpf,看到注册的是Application.Current.DispatcherUnhandledException,然后在该事件中设置e.Handled = true;如下图:

配置legacyUnhandledExceptionPolicy属性防止处理异常后程序崩溃退出(C#)

配置legacyUnhandledExceptionPolicy属性防止处理异常后程序崩溃退出(C#) 

但是查阅资料后发现,这种是UI线程抛出的异常处理, 对于非UI线程抛出的异常,还是需要用AppDomain.CurrentDomain.UnhandledException来捕捉

依旧没找到解决的方案,上一家另外一个系统的代码就无法获取到了,但我看过,记得是在AppDomain.CurrentDomain.UnhandledException注册的事件中通过代码的方式Dump出文件,但程序依旧还是会崩溃。

最后只能是网上不停地根据关键词去搜索,可能搜索的关键词不对,搜索了一段时间依旧没找到对对应的解决方案。没办法,只能看看AppDomain.CurrentDomain.UnhandledException注册的事件中的方法参数,看到有一个参数e(类型为UnhandledExceptionEventArgs)中一个属性isTerminating,指示公共语言运行时是否即将终止,如下图:

配置legacyUnhandledExceptionPolicy属性防止处理异常后程序崩溃退出(C#)

 很可惜,这个属性只能是获取而不能设置。再反编译看看它的构造函数,如下图:

配置legacyUnhandledExceptionPolicy属性防止处理异常后程序崩溃退出(C#)

 再打个断点调试一下,发现还是不行。只能是根据关键词isTerminating去stack overflow去搜搜看有没有解决方案了。还真找到了关键词:legacyUnhandledExceptionPolicy

链接如下:

c# - What causes the UnhandledExceptionEventArgs.IsTerminating flag to be true or false? - Stack Overflow

配置legacyUnhandledExceptionPolicy属性防止处理异常后程序崩溃退出(C#)

再通过关键词legacyUnhandledExceptionPolicy去搜索就发现很多博文了。

-------------------废话结束,可以跳过不看

好了,废话到此结束,正式开始本文的内容

测试环境:

vistual  studio 2017

winform 

.net framework 4..7 

步骤如下:

1  新增winfform程序,名为WindowsFormsApp1,在默认建好的窗体Form1中拖入一个Button按钮,并编写代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ThreadPool.QueueUserWorkItem((a) => {
                throw new Exception("测试抛出异常");

            });
        }
    }
}

2  在Program程序中编写代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
           Application.Run(new Form1());
        }

       
        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
           
            MessageBox.Show("捕获到异常信息");
        }
    }
}

3  新增配置文件App.config,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <legacyUnhandledExceptionPolicy enabled="1"/>
    <!--<legacyCorruptedStateExceptionsPolicy enabled="true"/>-->
  </runtime>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/></startup></configuration>

4  然后编译并生成,运行结果如下:

配置legacyUnhandledExceptionPolicy属性防止处理异常后程序崩溃退出(C#)

可以看到,程序发生异常后,并不会崩溃退出。

最后插一句,反编译工具dnspy的配置文件使用的是<legacyCorruptedStateExceptionsPolicy enabled="true" />

配置legacyUnhandledExceptionPolicy属性防止处理异常后程序崩溃退出(C#) 

但我试了一下,并不好使,改变.net framework的版本都试过,不好使,可能是我操作的姿势不对吧。 文章来源地址https://www.toymoban.com/news/detail-487667.html

到了这里,关于配置legacyUnhandledExceptionPolicy属性防止处理异常后程序崩溃退出(C#)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端如何防止数据被异常篡改并且复原数据

    每天,我们都在和各种文档打交道,PRD、技术方案、个人笔记等等等。 其实文档排版有很多学问,就像我,对排版有强迫症,见不得英文与中文之间 不加空格 。 所以,最近在做这么一个谷歌扩展插件 chrome-extension-text-formatting,通过谷歌扩展,快速将选中文本,格式化为符合

    2024年02月05日
    浏览(45)
  • 中间件中防止数据上下文并发导致异常

    在ASP.NET Core中,如果你想在中间件中只使用一个实例的数据库上下文(DbContext),你需要确保这个上下文在整个请求中是可用的,并且中间件在处理请求时能够访问它。以下是如何做到这一点的步骤: 注册DbContext为Scoped : 在Startup.cs的 ConfigureServices 方法中,你需要将你的D

    2024年01月24日
    浏览(43)
  • 206、SpringBoot 整合 RabbitMQ 的自动配置类 和 对应的属性处理类 的知识点

    ▲ Spring Boot 提供了一个 spring-boot-starter-amqp 的Starter来支持RabbitMQ,只要添加该Starter,它就会添加 spring-rabbit 依赖库(它有传递依赖了amqp-client.jar) ▲ 只要类加载路径下包含了 spring-rabbit 依赖库, Spring Boot 会自动配置 CachingConnectionFactory (CachingConnectionFactory:带缓存的连接工

    2024年02月07日
    浏览(41)
  • 大数据-之LibrA数据库系统告警处理(ALM-12042 关键文件配置异常)

    告警解释 系统每隔一个小时检查一次系统中关键的配置是否正确,如果不正常,则上报故障告警。 当检查到配置正确时,则告警恢复。 告警属性 告警ID 告警级别 可自动清除 12042 严重 是 告警参数 参数名称 参数含义 ServiceName 产生告警的服务名称。 RoleName 产生告警的角色名

    2024年02月04日
    浏览(33)
  • SpringBoot -05 SpringBoot web相关配置(静态资源访问、统一异常处理、文件上传、拦截器、统一跨域请求处理)

    小总结 SpringBoot是一个基于Spring的工具集,去帮我们完成了大量的配置。在SpringBoot中有一个约定大于配置的概念,就是他把我们很多第三方框架帮我们写好了,而且把我们整个第三方框架所需要的依赖全都通过起步依赖加进去了。开发中只需要加入起步依赖就可以实现某个场

    2024年02月01日
    浏览(43)
  • qt 3个线程处理 防止出现死锁

    在 Qt 中,可以使用 QThread 和moveToThread() 方法将任务转移到不同的线程中执行,以避免死锁问题的出现。 以下是一个简单的示例,展示了如何使用三个线程来处理任务:

    2024年02月11日
    浏览(42)
  • C++中防止头文件重复包含处理办法

    首先给出可以拷贝的模板: 在小型项目中,如果将函数的定义写在 main 函数的后面,那么需要在 main 函数前面加上这个函数的声明才可以顺利运行成功。 当然如果你不想写函数声明也可以,将函数的定义放在 main 函数前面即可。 但是在大项目中一般不会这么写,那得多少个

    2024年02月08日
    浏览(36)
  • Spring Boot学习随笔- 后端实现全局异常处理(HandlerExceptionResolver),前后端解决跨域问题(@CrossOrigin(局部解决)自定义跨域配置类(全局))

    学习视频:【编程不良人】2021年SpringBoot最新最全教程 异常处理作用:用来解决整合系统中任意一个控制器抛出异常时的统一处理入口 传统单体架构下的处理方式 配置全局异常处理类 resolveException :当控制器方法出现异常时,如果该方法没有try...catch,则会进入当前方法 针

    2024年02月04日
    浏览(61)
  • 防止video视频被下载的几种处理办法

    1,video禁用下载功能 2,隐藏鼠标右键,禁止复制链接 3,使用云点播等第三方播放控件,最好的话设置一下防盗链; 4,使用blob视频流加密的形式; 部分浏览器,如qq浏览器会拦截video标签获取到播放链接,当用户鼠标移如播放器时会出现下载字样,为了解决这一问题,我们

    2024年02月16日
    浏览(36)
  • 记录一次:Winform的控件的Visible属性异常问题

    有一次同事找到我,说以下代码中:btnPlanAppend控件:客户电脑显示正常、开发者电脑调试时无法显示 btnAppend可以在界面中显示出来 btnPlanAppend控件在界面上就是不显示 SajetCommon.CheckEnabled(\\\"INSERT\\\", sPrivilege)方法的返回结果:true; btnAppend控件也能正常显示 调试到这一行(btnPlanA

    2024年02月08日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包