AppDomain.CurrentDomain.UnhandledException不会捕获异常

时间:2018-03-21 09:55:52

标签: c# exception exception-handling

在我的应用程序中,我不希望应用程序在抛出未处理的异常时总是崩溃。我做了一些研究,发现了一些EventHandler。

在此Page上写着:

  

在典型的WPF应用程序中,您应该将Application.Current.DispatcherUnhandledException用于在UI线程上生成的异常,并AppDomain.CurrentDomain.UnhandledException用于所有其他异常。

在我的情况下,我需要Application.Current.DispatcherUnhandledException处理程序(我想是这样)。

我做了以下。首先在App.xaml.cs OnStartup(...)中 - 我写的方法:

protected override void OnStartup(StartupEventArgs e)
{
    Application.Current.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(Application_DispatcherUnhandledException);
}

我在下面几行创建了方法:

private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
    e.Handled = true;
    //TODO: StackTrace
    MessageBox.Show("An unhandled exception just occurred: " + e.Exception.Message + e.Exception.Data, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}

这就是我需要的吗? 在我的MainView代码隐藏文件中,我创建了一个异常:

private void Button_Click(object sender, RoutedEventArgs e)()
{
    string asd = null;
    asd.Trim();
}

执行我的程序后仍然因System.NullReferenceException崩溃,因为字符串asd为空。我错了什么。

2 个答案:

答案 0 :(得分:1)

AppDomain.CurrentDomain.UnhandledException是一个事件,无法避免应用程序崩溃......

避免应用程序崩溃的唯一方法是将Application.Run方法包装在Try-Catch块中。你会发现它通常在Main()函数中。

问题是,这只能让你有机会重新启动UI,因为在catch块你的主循环之外......

我认为解决方案是编写更好的代码,在必要时捕获异常(如果可能)......

答案 1 :(得分:1)

以下是msdn.microsoft.com的摘录:

  

当通过Dispatcher执行的代码抛出未处理的异常时,会发生UnhandledException事件。
  UnhandledExceptionFilter事件提供了一种不引发UnhandledException事件的方法。首先引发UnhandledExceptionFilter事件,如果DispatcherUnhandledExceptionFilterEventArgs上的RequestCatch设置为false,则不会引发UnhandledException事件。

因此,我建议在Handled方法中将DispatcherUnhandledExceptionEventArgs类的true属性设置为e.Handled = true,即Application_DispatcherUnhandledException()

<强>更新
您也可以使用UnhandledExceptionFilter。以下是this链接的摘录:

  

<强>说明

     

在过滤阶段引发此事件,以便在通过Invoke或BeginInvoke执行委托期间引发异常并且未被捕获。

     

此时调用堆栈未展开(第一次机会异常)。   必须小心编写此事件的事件处理程序,以避免创建二级异常并捕获任何发生的异常。建议避免在处理程序中分配内存或执行任何资源密集型操作。

     

UnhandledExceptionFilter事件提供了一种不引发UnhandledException事件的方法。首先引发UnhandledExceptionFilter事件,如果DispatcherUnhandledExceptionFilterEventArgs上的RequestCatch设置为false,则不会引发UnhandledException事件。