Необработанное исключение возникает после обработки исключения - PullRequest
0 голосов
/ 10 декабря 2018

Эта тема из моего предыдущего вопроса: Как удалить и создать журнал в средстве просмотра событий Windows

Я создал приложение wpf.Я перехватываю необработанное исключение тремя способами:

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

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Глобальная обработка ошибок, подобная этой, должна закрыть приложение.У вас есть исключение откуда-то или другое, и приложение находится в каком-то неизвестном состоянии.

Если вы поймете ошибку и просто дадите пользователю продолжить, то у вас нет возможности узнать, что произойдет.

«Стандартный» подход заключается в регистрации ошибки и ее завершении с помощью

 Application.Current.Shutdown();
0 голосов
/ 10 декабря 2018

В вашем методе-обработчике вы должны сообщить .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
}

Тем не менее, вы все равно должны обрабатывать исключения, где они могут возникать (насколько это возможно).Возьмите приведенный вами пример, который выглядит как проблема с сетевым подключением.Если вы обнаружили это исключение при создании соединения, вы можете сказать пользователю что-то более конкретное, например: «Я не смог подключиться к базе данных. Работает ли ваша сеть?»Принимая во внимание, что если вы полагаетесь на это, чтобы отследить такого рода ошибки, вы можете только извергнуть сообщение об исключении, которое часто не имеет смысла для пользователя.

Это следует использовать в качестве последней меры отказоустойчивости.Он не должен заменять ловлю исключения во всем вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...