微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何禁用.NET Frameworkexception处理并使用我自己的呢?

我已经开发了一个.NET 4软件,我准备将它发送给testing版用户。 如果在软件中抛出一个未处理的exception,我想抓住它,logging下来并发送日志给我。 我已经实现了这个function,当我用Visual Studio在debugging模式下运行时,它似乎运行正常。 但是,当我构build了该软件的发行版本并安装它时,Microsoft .NET Framework在我的代码之前开始捕获exception。 我popup一个错误消息:“应用程序中的某个组件发生了未处理的exception,如果单击”继续“,应用程序将忽略此错误并尝试继续。

为了testing崩溃,我创build了一个崩溃button,引发exception。 这个崩溃logging自己和exception处理程序logging所有收到的未处理的exception。 当我查看发行版本的日志时,我只能看到崩溃的日志消息,而不是来自exception处理程序。

我用这个代码附加了我自己的exception处理程序:

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

有没有一些方法来禁用.NET框架的exception捕获或有更好的方法来附加我自己的exception处理程序?

C# – 删除文本文件中的重复行

在.NET 4.5中编写的软件需要什么版本的.NET运行时?

为什么winform面板仅在鼠标hover或鼠标点击时更新?

SetServiceStatus总是给出“无效的当前状态0”

为什么不同的计算机或操作系统上的文化date格式不同?

更新:我正在使用WPF。 我会研究dispatcherUnhandledException并让你知道它是否解决了这个问题。

更新#2:不幸的是添加处理程序到Application.Current.dispatcherUnhandledException并没有解决问题。 显然,这个debuggingpopup窗口是由Visual Studio附带的JIT(Just-In-Time)debugging器创build的。 我将不得不用“民用”Windowstesting软件,看看是否也有例外。

更新#3:出于某种原因使用Visual Studio构build的发行版可以工作,但是使用MSBuild脚本和Dotfuscator构build的版本不能。

命令和复合应用程序块中的事件之间的区别

我们可以从共享path运行batch file(.bat)吗?

如何防止显示“程序意外终止”窗口?

C#/。NET:从回收站中的文件中检索内容/文件属性

如何从64位应用程序使用C#代码获取32位应用程序数据文件

你没有指定你正在使用的框架,但是还有其他的“未处理的异常”事件。

对于Windows窗体,有Application.ThreadException 。

对于WPF / Silverlight有Application.dispatcherUnhandledException 。

先尝试其中一个,让我们知道如果你仍然有问题。

我终于解决了这个问题。 这个问题不是由于侦听到错误的异常,而是由于从发布的版本中遗漏了一个DLL引起的。

在为dispatchedUnhandledException和ThreadException事件添加侦听器之后,我不再有奇怪的Microsoft .NET Framework弹出窗口,允许用户在异常之后继续运行软件。 然而,我自己的异常处理在这一点上仍然被打破。

因为在异常处理程序本应该启动的时候,软件已经崩溃了,所以我在异常处理程序周围有一个catch(Exception)。 删除这个捕获后,我终于得到正确的错误信息与发布版本,并添加了缺少的DLL。

我再次学到的教训是:不要使用空的catch(Exception)块。 这是邪恶的。

这听起来像是冒泡到你的应用程序的消息循环。 在Windows窗体中,可以通过为Application.ThreadException事件设置事件处理程序来处理这些事件。 在WPF / Silverlight中,等效事件将是Application.dispatcherUnhandledException 。

你也可以在你的Main方法中放一个try / catch(如果有的话),但是UI通常会首先捕获异常,就像你注意到的那样。

编辑

在WPF / Silverlight中,设置e.Handled = true以防止异常继续上升。

Ouch … Dotfuscator 可能会生成一个无效的程序集,而这个程序集不是JIT'able。 JIT异常永远不会被用户代码捕获。 这与您无法捕获StackOverflowException的方式类似,因为运行时无法保证您可以安全地从遇到的错误情况中恢复。

尽管如此,在运行时却不太可能得到JIT异常,因为在IL和JITer之间有不同的验证阶段。 也许你有一个InvalidProgramException或一个BadImageFormatException ? 如果JITter真的失败了,这很可能是运行时错误,不应该发生。

无论如何,你可以检查两件事情:

在破损/工作组件上运行PEVerify并比较输出

尝试NGEN你的破碎大会,看看你是否可以挑起错误

您可以查看AppDomain类和UnhandledException事件和Application.ThreadException事件 。 这些将捕获未处理的异常,对于使用try-catch块处理的异常,您可以编写一个助手类来管理异常,并根据需要执行它们。 你甚至可以在该类中写第三个事件来处理异常。

// Add the event handler for handling UI thread exceptions to Windows Form Events. // Uses SystemThreading. // NOTE: Remember to turn Execption Handler OFF in the Debugger for testing!! Debug -> Common Language Runtime Exceptions -> User-Unhandled -> OFF. // NOTE: A separate Event Handler is Needed for other threads added to the Application. // NOTE: Methods can catch,inform,then throw for logging and emailing as well. // Add these to Program.cs. static void Main() { Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); // Set the unhandled exception mode to force all Windows Forms errors to go through the Handler. Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); // ... } // Then put your handler in the method referenced in the event deFinition above. static void Application_ThreadException(object sender,ThreadExceptionEventArgs e) { // Your Code ... } // Sorry for the ragged listing. Still getting used to the editor here.

将try ... catch在Main()帮助try ... catch块?

从UnhandledException事件的文档中,

此事件提供未捕获异常的通知。 它允许应用程序在系统认处理程序向用户报告异常并终止应用程序之前记录有关该异常的信息。

这只是一个钩子方法,您可以在缺省的错误报告机制开始之前插入自定义代码。未处理的异常总是会占用您的进程。 它不允许你替换整个行为。

我首先问你追求的需要

最简单的方法是采用一个团队约定,主要和所有线程函数都有一个封闭的try-catch。

似乎有新的类型+事件(dispatcherUnhandledException)来捕获未处理的异常,但是我会怀疑它是否值得它拖入的复杂性。它应该是最后一道防线,而不是主要的防线。

例如,如果一个未处理的异常发生在另一个线程中,则需要更多的代码(因为异常不会在线程间路由,只会终止进程)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐