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

时间:2012-08-19 05:39:36

标签: 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 += 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");
}

如果在任何地方发生异常,那么显示的消息框很棒,问题就在它显示应用程序仍然崩溃的消息之后。如果我在调试中运行应用程序,Visual Studio将跳转到发生异常的地方,如果我继续它将转到消息框。

我认为问题与此有关,但我不确定。有没有办法像上面那样捕获异常,但同时没有应用程序崩溃?

谢谢

修改 通过UnhandledException部分的异常将是NullReference,NotSupported或大多数公园的数据库异常。如果像“Stack Overflow”这样的“严重”异常,我会简单地通知用户并杀死应用程序。我仍然需要找到一种方法来阻止应用程序崩溃非严重异常。

2 个答案:

答案 0 :(得分:11)

我认为你需要设置

dispatcherUnhandledExceptionEventArgs.Handled = true;

dispatcherUnhandledExceptionEventArgs.Handled = true;

答案 1 :(得分:0)

您的应用程序捕获了哪种异常?除非您正在设置HandleProcessCorruptedStateExceptionsAttribute属性,否则对于更改状态的异常使用UnhandledException将无效。

From MSDN documentation:
AppDomain.UnhandledException Event

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

http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx