有时,在不可重现的情况下,我的WPF应用程序会在没有任何消息的情况下崩溃。应用程序会立即关闭。

哪里是实现全局Try/Catch块的最佳位置。至少我必须实现一个消息框:“抱歉给您带来不便……”


当前回答

您可以处理AppDomain。UnhandledException事件

编辑:实际上,这个事件可能更合适:应用程序。DispatcherUnhandledException

其他回答

如上所述

Application.Current.DispatcherUnhandledException将无法捕获 从另一个线程抛出的异常,然后从主线程抛出。

这实际取决于线程是如何创建的

Application. current . dispatcherunhandledexception没有处理的一种情况是System.Windows.Forms.Timer。可以使用ThreadException来处理这些 如果在主线程以外的其他线程上运行窗体,则需要设置Application。来自每个这样的线程的线程异常

这里有一个完整的解决方案

它用示例代码解释得很好。但是,要注意它不会关闭应用程序。添加线条 Application.Current.Shutdown (); 优雅地关闭应用程序。

除上述职位外:

Application.Current.DispatcherUnhandledException

将不会捕获从主线程以外的线程抛出的异常。您必须在抛出异常的同一线程上捕获这些异常。但是如果你想在你的全局异常处理程序中处理它们,你可以把它传递给主线程:

 System.Threading.Thread t = new System.Threading.Thread(() =>
    {
        try
        {
            ...
            //this exception will not be catched by 
            //Application.DispatcherUnhandledException
            throw new Exception("huh..");
            ...
        }
        catch (Exception ex)
        {
            //But we can handle it in the throwing thread
            //and pass it to the main thread wehre Application.
            //DispatcherUnhandledException can handle it
            System.Windows.Application.Current.Dispatcher.Invoke(
                System.Windows.Threading.DispatcherPriority.Normal,
                new Action<Exception>((exc) =>
                    {
                      throw new Exception("Exception from another Thread", exc);
                    }), ex);
        }
    });

您可以处理AppDomain。UnhandledException事件

编辑:实际上,这个事件可能更合适:应用程序。DispatcherUnhandledException

Application.Dispatcher.UnhandledException的一个快速代码示例:

public App() {
    this.Dispatcher.UnhandledException += OnDispatcherUnhandledException;
}

void OnDispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) {
    string errorMessage = string.Format("An unhandled exception occurred: {0}", e.Exception.Message);
    MessageBox.Show(errorMessage, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
    // OR whatever you want like logging etc. MessageBox it's just example
    // for quick debugging etc.
    e.Handled = true;
}

我在App.xaml.cs中添加了这段代码