Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';Application.ThreadException和AppDomain.CurrentDomain.UnhandledException之间的区别是什么?_C#_.net_Winforms_Exception Handling - Fatal编程技术网

C# 什么';Application.ThreadException和AppDomain.CurrentDomain.UnhandledException之间的区别是什么?

C# 什么';Application.ThreadException和AppDomain.CurrentDomain.UnhandledException之间的区别是什么?,c#,.net,winforms,exception-handling,C#,.net,Winforms,Exception Handling,好的,这是一个简单的问题: Application.ThreadException与AppDomain.CurrentDomain.UnhandledException之间有什么区别 我需要同时处理这两个问题吗 谢谢 问题是,ThreadException是由于线程出现问题而发生的,如果代码抛出未处理的异常,将触发未处理的异常 导致第二个问题的最简单的方法是创建一个没有try…catch块的应用程序,并抛出一个异常 现在,如果您需要保险,您可以同时处理这两种情况,但是如果您捕获并正确处理了异

好的,这是一个简单的问题:

  • Application.ThreadException与AppDomain.CurrentDomain.UnhandledException之间有什么区别

  • 我需要同时处理这两个问题吗


谢谢

问题是,
ThreadException
是由于线程出现问题而发生的,如果代码抛出未处理的异常,
将触发未处理的异常

导致第二个问题的最简单的方法是创建一个没有try…catch块的应用程序,并抛出一个异常


现在,如果您需要保险,您可以同时处理这两种情况,但是如果您捕获并正确处理了
异常
,那么您不应该需要
未处理异常
处理程序,因为它有点像一个包罗万象的处理程序

好的-我已经把它放在我面前了,下面的代码是非常不言自明的:

public static void Main(string[] args)
{
    // Add the event handler for handling UI thread exceptions to the event.
    Application.ThreadException += new 
        ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);

    // Set the unhandled exception mode to force all Windows Forms 
    // errors to go through our handler.
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

    // Add the event handler for handling non-UI thread exceptions to the event. 
    AppDomain.CurrentDomain.UnhandledException +=
        new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    // Runs the application.
    Application.Run(new ErrorHandlerForm());
}

Application.ThreadException特定于Windows窗体。Winforms运行事件处理程序以响应Windows发送给它的消息。比如点击事件,我相信你知道。如果这样的事件处理程序抛出异常,那么在捕获该异常的Winforms消息循环中会有一个back stop

那个后盾触发了事件。如果不重写它,用户将获得一个。这样他就可以忽略异常并继续运行你的程序。顺便说一句,这不是个好主意

您可以通过调用Program.cs中的Main()方法来禁用此行为。如果没有适当的支持,当线程因未处理的异常而死亡时,通常会发生这样的情况:触发,程序终止

Fwiw:“ThreadException”是一个非常糟糕的名称选择。它与线程无关。

来自:

在使用Windows窗体的应用程序中 主应用程序线程导致应用程序。线程异常 要提出的事件。如果已处理此事件,则默认行为为 未处理的异常不会终止应用程序, 尽管应用程序处于未知状态。那么,, 未引发
未处理异常
事件。这种行为可以是 通过使用应用程序配置文件或
Application.SetUnhandledExceptionMode
方法将模式更改为
未处理的异常模式。在
线程异常
事件处理程序已连接。这仅适用于主应用程序 线针对未处理的异常引发
UnhandledException
事件 在其他线程中引发异常

从Visual Studio 2005开始,Visual Basic应用程序 框架为主框架中未处理的异常提供了另一个事件 应用程序线程-
WindowsFormsApplicationBase.UnhandledException
。 此事件的事件参数对象与 AppDomain.UnhandledException使用的事件参数对象,但具有 不同的属性。特别是,此事件参数对象具有 允许应用程序继续的
ExitApplication
属性 正在运行,忽略未处理的异常(并离开应用程序 处于未知状态)。在这种情况下,AppDomain.UnhandledException 未引发事件

Application.ThreadException
可以被捕获,并且应用程序可以继续运行(一般来说这不是一个好主意,但对于定期运行某些操作的应用程序来说,这是一个很好的解决方案)

要捕获非Windows窗体创建和拥有的线程中发生的异常,请使用AppDomain.UnhandledException。它允许应用程序在系统默认处理程序向用户报告异常并终止应用程序之前记录有关异常的信息。
处理此异常不会阻止应用程序终止
可以做的最大工作(如果不处理异常,程序数据可能会损坏)是保存程序数据以供以后恢复。然后卸载应用程序域并终止应用程序

.NET 4开始,不会针对异常引发此事件 破坏进程状态的错误,例如堆栈溢出或 访问冲突,除非事件处理程序是安全关键的且 具有
HandleProcessCorruptedStateExceptions属性


有关更多详细信息,请参阅。

谢谢-我不太清楚的是,如果处理未处理的异常,我也会捕获ThreadException-这似乎不是事实。这与serhio的另一个回答相反,他说:应在连接ThreadException事件处理程序之前设置UnhandledExceptionMode.ThroweException。不确定这个命令是否真的重要…@DavidePiras是的,还有更模糊的东西。SetUnhandledException在我的情况下似乎没有什么不同。以及如何阻止WinForms应用程序在出现
application.ThreadException
时崩溃。我用我的小C#代码对此提出了一个问题。鉴于winforms绑定到单个线程,我总是将其作为应用程序线程异常来阅读。