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

本文关键字:未处理 异常 任何 线程 | 更新日期: 2023-09-27 18:05:09

编辑

这个问题的答案很有用,谢谢你的帮助:(但我最终使用了: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>

App.xaml:的代码隐藏

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

当错误发生在主线程上时,该解决方案非常有效。现在我的问题是,我如何才能捕捉到发生在不同线程上的错误?

换句话说:当我按下这个按钮时,我可以捕捉到异常:(App_DispatcherUnhandledException被调用!(

    private void button1_Click(object sender, RoutedEventArgs e)
    {            
        int.Parse("lkjdsf");
    }

但我无法捕捉到这个例外:

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

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

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

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

使用AppDomain.UnhandledException事件捕获此异常。您需要使用调度器才能在messageBox中显示此异常(这是因为只有ui线程可以显示消息(