在我的应用程序中,我不希望应用程序在抛出未处理的异常时总是崩溃。我做了一些研究,发现了一些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
为空。我错了什么。
答案 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事件。