Использование обработчика исключений winforms по умолчанию с приложениями WPF - PullRequest
2 голосов
/ 26 октября 2009

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

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

Очевидно, я могу написать свой собственный обработчик исключений по умолчанию для WPF, но есть ли простой способ использовать тот, который уже должен быть в фреймворке для Winforms, но с WPF?

Ответы [ 2 ]

3 голосов
/ 26 октября 2009

Я думаю, что этот вопрос состоит из двух частей: как подключить собственный обработчик исключений, чтобы приложение продолжало работу, и можно ли повторно использовать пользовательский интерфейс необработанных исключений Windows Forms.

Первая часть приведена в разделе Application.DispatcherUnhandledException. Если вы подписались на это событие, а ваш обработчик события установил для DispatcherUnhandledExceptionEventArgs.Handled значение true, то WPF пропустит обработку необработанных исключений по умолчанию, т. Е. Приложение не будет автоматически закрываться. (Конечно, ваш обработчик событий все еще может его выключить.) По умолчанию для параметра handled не установлено значение true, поэтому вы должны сделать это явно.

Для второй части см. System.Windows.Forms.ThreadExceptionDialog. Это официально «не предназначено для использования из вашего кода» и не документировано каким-либо полезным способом, поэтому не стоит полагаться на него для производственных приложений. Однако, если вы хотите рискнуть, вы можете создать экземпляр этого класса и ShowDialog () его. В .NET 3.5 он возвращает DialogResult.Cancel, чтобы означать «игнорировать исключение и продолжить», а DialogResult.Abort, чтобы означать «выход». Эти значения не документированы и должны рассматриваться как детали реализации!

3 голосов
/ 26 октября 2009

ОК, я покопался в источнике Winforms, и оказалось, что стандартный диалог исключений Winforms является публичным.Поэтому вам нужно использовать обработчик DispatcherUnhandledException в стиле WPF и сделать что-то вроде этого:

void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
    using (ThreadExceptionDialog dlg = new ThreadExceptionDialog(e.Exception))
    {
        DialogResult result = dlg.ShowDialog();
        if (result == DialogResult.Abort)
        {
            Environment.Exit(-1);
        }
        else if (result == DialogResult.Cancel)
        {
            e.Handled = true;
        }
    }
}

Вам нужно добавить ссылку на System.Windows.Forms и, возможно, потребуется немного поиграть с пространствами именкласс вашего приложения, но другие люди могут найти его полезным для простых служебных приложений.

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