Wpf 未处理的异常在被捕获后仍会使应用程序崩溃

Wpf 未处理的异常在被捕获后仍会使应用程序崩溃,wpf,visual-studio-2010,c#-4.0,exception-handling,unhandled-exception,Wpf,Visual Studio 2010,C# 4.0,Exception Handling,Unhandled Exception,我有一个WPF应用程序,它由多个具有表单、类、基类等的项目组成 由于庞大的代码库,我希望确保如果发生异常,我可以捕获它,通知用户并让应用程序继续运行而不会崩溃。我理解这样做的利弊 在应用程序的App.xaml.cs中,我有: private void OnApplicationStartup(object sender, StartupEventArgs e) { Application.Current.DispatcherUnhandledException += CurrentOnD

我有一个WPF应用程序,它由多个具有表单、类、基类等的项目组成

由于庞大的代码库,我希望确保如果发生异常,我可以捕获它,通知用户并让应用程序继续运行而不会崩溃。我理解这样做的利弊

在应用程序的App.xaml.cs中,我有:

private void OnApplicationStartup(object sender, StartupEventArgs e)
{
    Application.Current.DispatcherUnhandledException += CurrentOnDispatcherUnhandledException;
    AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
    Dispatcher.UnhandledException += DispatcherOnUnhandledException;
    UI.Views.Windows.MainWindow.Show();
}

private void DispatcherOnUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs dispatcherUnhandledExceptionEventArgs)
{
    MessageBox.Show("TEST 3");
}

private void CurrentDomainOnUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs)
{
    MessageBox.Show("TEST 2");
}

private void CurrentOnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs dispatcherUnhandledExceptionEventArgs)
{
    MessageBox.Show("TEST 1");
}
如果在显示这些消息框的任何地方发生异常(这很好),那么问题就在显示消息之后,应用程序仍然崩溃。如果我在调试中运行应用程序,VisualStudio将跳转到发生异常的位置,如果我继续,它将转到消息框

我认为问题与此有关,但我不确定。有没有一种方法可以像上面那样捕获异常,但同时又不会让应用程序崩溃

多谢各位

编辑
进入UnhandledException部分的异常将是NullReference、NotSupported或most公园的数据库异常。如果一个“严重”异常像堆栈溢出一样发生,我将简单地通知用户并关闭应用程序。我仍然需要找到一种方法来阻止应用程序在非严重异常情况下崩溃。

您的应用程序捕获的是哪种异常?除非设置HandleProcessCorruptedStateExceptionsAttribute属性,否则对更改状态的异常使用UnhandledException将不起作用

From MSDN documentation:
AppDomain.UnhandledException Event
从.NET Framework 4开始,对于损坏进程状态的异常(如堆栈溢出或访问冲突),不会引发此事件,除非事件处理程序是安全关键的并且具有HandleProcessCorruptedStateExceptionsAttribute属性

From MSDN documentation:
AppDomain.UnhandledException Event

我想你需要设置

dispatcherUnhandledExceptionEventArgs.Handled = true;

进入UnhandledException部分的异常将是NullReference、NotSupported或数据库异常。如果一个“严重”异常像堆栈溢出一样发生,我将简单地通知用户并关闭应用程序。因此,我需要找到一种方法来阻止应用程序因非严重异常而崩溃。unhandledExceptionEventArgs没有Handled属性:(@Firo,可能会解释原因。“如果代码到达此事件处理程序,则完全无法恢复……阻止对话框的唯一方法是使用Environment。退出(1);”答案不正确,因为UnhandledExceptionEventTargets没有Handled属性。解决方案是捕获在后台(工作线程)线程上引发的异常,然后在主线程(最有可能是UI线程)上重新引发该异常。重新引发后,将在DispatcherUnhandledException事件处理程序中处理该异常。