Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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# AppDomain.UnhandledException自动重新引发已处理的异常_C#_Wpf_Exception_Exception Handling - Fatal编程技术网

C# AppDomain.UnhandledException自动重新引发已处理的异常

C# AppDomain.UnhandledException自动重新引发已处理的异常,c#,wpf,exception,exception-handling,C#,Wpf,Exception,Exception Handling,我试图捕获我的应用程序中所有未处理的异常,以便有条件地处理那些可以在不终止应用程序的情况下处理的异常,但我无法解决一个非常基本的问题:它不会停止异常。代码中的某个地方抛出了一个未处理的异常,它出现在这里,显示消息框,然后应用程序显示相同的异常未处理(如果处于调试模式),或者只是崩溃(如果在未调试的情况下运行)。这意味着即使调用了处理程序,异常仍保持未处理状态 App(){ AppDomain.CurrentDomain.UnhandledException+=(s,a)=>{ var ex=(异

我试图捕获我的应用程序中所有未处理的异常,以便有条件地处理那些可以在不终止应用程序的情况下处理的异常,但我无法解决一个非常基本的问题:它不会停止异常。代码中的某个地方抛出了一个未处理的异常,它出现在这里,显示消息框,然后应用程序显示相同的异常未处理(如果处于调试模式),或者只是崩溃(如果在未调试的情况下运行)。这意味着即使调用了处理程序,异常仍保持未处理状态

App(){
AppDomain.CurrentDomain.UnhandledException+=(s,a)=>{
var ex=(异常)a.ExceptionObject;
MessageBox.Show(例如Message,“Error”,MessageBoxButton.OK,MessageBoxImage.Error);
};
}
这来自一个新的空白测试项目,该项目中没有任何内容,只有此代码和一个在单击时引发异常的按钮。

它不应该“停止”异常,该行为:

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

考虑到这个地方,如果没有其他人费心处理所讨论的异常,那么除了日志和死亡之外,没有什么明智的事情可以做


您应该处理这些异常,这些异常应该在靠近发生位置终止应用程序。

如果这确实是您想要的行为,您可以将以下内容添加到应用程序配置文件中:

<legacyUnhandledExceptionPolicy enabled="1"/>

请参阅。

此事件提供未捕获异常的通知。它允许应用程序在系统默认处理程序向用户报告异常并终止应用程序之前记录有关异常的信息。如果有关应用程序状态的足够信息可用,则可以执行其他操作,例如保存程序数据以供以后恢复。建议谨慎,因为如果不处理异常,程序数据可能会损坏


换句话说,它只是一个处理程序,允许您告诉用户发生了什么,如果需要恢复数据,可以在最后一分钟生成保存信息,或者执行类似于触发自定义错误报告的操作它不是catch块。要捕获异常,您必须使用Try catch。

您实际上并没有捕获未处理的异常,而只是处理在终止应用程序之前发生的事件(在发布模式下)。订阅此事件不算作捕获已未处理的异常

发件人:
此事件提供未捕获异常的通知。它允许应用程序在系统默认处理程序向用户报告异常并终止应用程序之前记录有关异常的信息。如果有关应用程序状态的足够信息可用,则可以执行其他操作,例如保存程序数据以供以后恢复。请注意,因为如果不处理异常,程序数据可能会损坏。

您忘记了终止程序。因此,它继续进行正常的未处理异常处理。添加此行:

  Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(ex));

稍微费劲的封送处理调用可确保另一个获得进程的process.ExitCode的进程获得合理的错误指示。这是可选的,只是建议使用。

谢谢,不过这只是意味着我回到了第一步——如何设置全局(支持多线程)异常处理程序。我对多线程不太了解,但我怀疑您必须尝试捕获每个线程的根方法。这将使您能够更好地控制如何逐个线程地处理异常,因为每个线程可能正在执行不同的操作,这将需要不同的处理。如果我正确理解MSDN文档,这也将使后台线程中任何未处理的异常都被静默地处理。这对我不起作用,我需要一种方法来捕获(并有条件地处理)所有未处理的异常,而不管它们被抛出到哪里。@我不理解操作方法。你试过了吗?我的理解是,
UnhandledException
仍会捕获异常,但它们不会终止进程。您可以评估您的异常,并在必要时终止。