Обрабатывать глобальные исключения, не убивая приложение? - PullRequest
2 голосов
/ 26 января 2012

Я выбрасываю различные пользовательские исключения из моего кода.

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

Я нашел событие AppDomain.UnhandledException с аргументом IsTerminating, но оно доступно только для чтения.

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

(Это в формах, но я бы тоже заинтересовался решением WPF)

Ответы [ 4 ]

0 голосов
/ 01 мая 2018

Это старый поток, но в событии Dispatcher.UnhandledException есть параметр Handled, который можно использовать для остановки приложения.

0 голосов
/ 26 января 2012

Попробуйте что-то вроде:

AppDomain.CurrentDomain.UnhandledException += AppDomainUnhandledException;

public static void AppDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    // You might have to try changing this to your custom exception type and then have overloads or pass it as an object and cast it in the HandleException method
    HandleException(e.ExceptionObject as Exception);
}

private static void HandleException(Exception exception)
{
    if (exception == null) return;

    // Do a check in here against the exceptions that you want to handle or don't want to handle and either display a message, log, quit, etc
}

Не заметил winforms, я давно не делал формы, так что это WPF, может сработать или, возможно, потребуется настроить.

0 голосов
/ 26 января 2012

Нашли решение. Используйте Application.ThreadException вместо AppDomain.UnhandledException. Но вы также должны указать ему, что также должны быть исключения в потоке пользовательского интерфейса:

public static void SetupGlobalExceptionHandler()
{
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
    Application.ThreadException += OnException;
}

static void OnException(object sender, ThreadExceptionEventArgs args)
{
    MessageBox.Show("There was a problem. Error is:\n\n" + args.Exception.Message);
}
0 голосов
/ 26 января 2012

Вы можете использовать global.asax и событие

void Application_Error(object sender, EventArgs e)
{
}

для отлова ошибок, которые не обнаруживаются на странице.

В этом случае вы можете использовать несколько методов, но одним из таких способов было бы что-то вроде этого:

void Application_Error(object sender, EventArgs e)
{
    Exception opException = Server.GetLastError();

    switch (opException.GetBaseException().GetType().Name)
    {
        case "OptimisticConcurrencyException":
                        //display a friendly message
                    break;
    }


    Server.ClearError();

}

или что-то подобное

...