我之前提出的问题中的这个主题:How to remove and create log in Windows Event Viewer
我创建了wpf应用。我通过3种方式捕获未处理的异常:
public partial class App : Application
{
public App()
{
DispatcherUnhandledException += App_DispatcherUnhandledException;
Dispatcher.UnhandledException += Dispatcher_UnhandledException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
}
private void Dispatcher_UnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
}
private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
}
}
我正在创建这样的异常:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
throw new Exception("Test exception");
}
}
在执行方法(Dispatcher_UnhandledException
,CurrentDomain_UnhandledException
,App_DispatcherUnhandledException
)之后,此异常仍将引发。 Windows Event Viewer会像这样创建日志
说明:由于未处理的异常,进程已终止。 异常信息:System.InvalidOperationException 在System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(System.Data.Common.DbConnection,System.Threading.Tasks.TaskCompletionSource
1<System.Data.ProviderBase.DbConnectionInternal>, System.Data.Common.DbConnectionOptions, System.Data.ProviderBase.DbConnectionInternal, System.Data.ProviderBase.DbConnectionInternal ByRef) at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(System.Data.Common.DbConnection, System.Data.ProviderBase.DbConnectionFactory, System.Threading.Tasks.TaskCompletionSource
1
答案 0 :(得分:6)
在处理程序方法中,您需要告诉.NET您已经处理了异常。否则它将仍然终止该应用程序。您可以使用Handled
对象的DispatcherUnhandledExceptionEventArgs
属性来完成此操作。
因此,如果您决定尽管有例外就希望继续运行该应用程序,请将其设置为true
:
private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
e.Handled = true; //let's continue and see if anything explodes
}
也就是说,您仍应处理可能发生的异常(尽可能多)。以您提供的示例为例,它看起来像是网络连接问题。如果在创建连接时捕获到该异常,则可以告诉用户更具体的信息,例如“我无法连接到数据库。您的网络正常吗?”。而如果您依靠它来捕获此类错误,则只能重新定义异常消息,这通常对用户没有意义。
这应该用作最后故障保护。它不应替换整个代码中的捕获异常。
答案 1 :(得分:-2)
这样的全局错误处理应关闭应用程序。 您在某处或其他地方有例外,并且该应用处于未知状态。
如果您发现错误并只是让用户继续操作,那么您将无法知道将会发生什么。
“标准”方法是记录错误,然后使用
关闭 Application.Current.Shutdown();