处理异常后发生未处理的异常

时间:2018-12-10 16:00:09

标签: c# wpf unhandled-exception

我之前提出的问题中的这个主题: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_UnhandledExceptionCurrentDomain_UnhandledExceptionApp_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

2 个答案:

答案 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();