从任何线程中捕获未处理的异常

Ton*_*Nam 10 .net c# wpf exception unhandled-exception

编辑

这个问题的答案在哪里有用,谢谢我感谢帮助:)但我最终使用:http://code.msdn.microsoft.com/windowsdesktop/Handling-Unhandled-47492d0b#content


原始问题:

我想在应用程序崩溃时显示错误消息.

目前我有:

App.xaml:

<Application x:Class="WpfApplication5.App"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      DispatcherUnhandledException="App_DispatcherUnhandledException"  // <----------------
      StartupUri="MainWindow.xaml">
    <Application.Resources>             
    </Application.Resources>
</Application>
Run Code Online (Sandbox Code Playgroud)

代码隐藏App.xaml:

namespace WpfApplication5
{        
    public partial class App : Application
    {
        private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            MessageBox.Show("Caught Unhandled Exception!");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当主线程发生错误时,该解决方案很有效.现在我的问题是如何能够捕获在不同线程上发生的错误?

换句话说:当我按下此按钮时,我能够捕获异常:( App_DispatcherUnhandledException被调用!)

    private void button1_Click(object sender, RoutedEventArgs e)
    {            
        int.Parse("lkjdsf");
    }
Run Code Online (Sandbox Code Playgroud)

但是我无法捕捉到这个异常:

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        Task.Factory.StartNew(() =>
        {
            int.Parse("lkjdsf");
        });
    }
Run Code Online (Sandbox Code Playgroud)

无论它们是否发生在主线程上,我如何能够捕获所有异常?

Til*_*lak 12

您可以使用AppDomain.UnhandledExceptionHandler来处理未捕获的异常.

  • 这不会捕获来自其他线程的未处理异常。`Task.Factory.StartNew(() =&gt; throw new Exception("Hey this is an exception"));` 不会被此事件处理程序捕获。 (2认同)