3

我有一个 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 一样出现“严重”异常,我会简单地通知用户并终止应用程序。不过,我仍然需要找到一种方法来阻止应用程序因非严重异常而崩溃。

4

2 回答 2

12

我认为你需要设置

dispatcherUnhandledExceptionEventArgs.Handled = true;
于 2012-08-19T06:10:21.930 回答
0

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

From MSDN documentation:
AppDomain.UnhandledException Event

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

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

于 2012-08-19T05:52:31.023 回答