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

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


当前回答

为了补充Thomas的回答,Application类还有可以处理的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中添加了这段代码

为了补充Thomas的回答,Application类还有可以处理的DispatcherUnhandledException事件。

你可以在不同的级别捕获未处理的异常:

AppDomain. currentdomain . unhandledexception 调度员。从单个特定的UI分派器线程中UnhandledException。 来自WPF应用程序的主UI调度程序线程。 TaskScheduler。每个使用任务调度器进行异步操作的AppDomain内的UnobservedTaskException。

您应该考虑需要在哪个级别捕获未处理的异常。

选择#2还是#3取决于你是否使用了多个WPF线程。这是一种非常奇特的情况,如果你不确定你是不是,那么很可能你不是。

您可以处理AppDomain。UnhandledException事件

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

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

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