Подавить необработанное исключение в диалоге? - PullRequest
2 голосов
/ 04 апреля 2010

Я обрабатываю все мои неисчислимые исключения в коде, но всякий раз, когда это происходит (не во время отладки), я получаю свое окно с ошибкой, и как только оно закрывается " В вашем приложении возникла исключительная ситуация необработанного приложения"окно всплывает. Как мне это подавить?

PS: я не использую ASP.NET , я использую Windows Forms

Ответы [ 4 ]

4 голосов
/ 04 апреля 2010

Вы не можете подавить исключение AppDomain.UnhandledException. Произошло что-то действительно неприятное, поток от вашей программы умер от сердечного приступа. Шансы на то, что программа будет продолжать работать осмысленно, равны нулю, .NET прекращает страдания, завершая программу.

Напишите обработчик события для события AppDomain.CurrentDomain.UnhandledException и зарегистрируйте или отобразите значение e.ExceptionObject.ToString (), чтобы вы знали, что вызвало ошибку. Это дает вам подсказку, как исправить ваш код. Если таковые имеются, это может быть что-то, что вы не можете исправить самостоятельно. Например, неисправность сервера базы данных. Поэтому делать что-либо для умышленного сокрытия ошибки - очень плохая идея. Служба поддержки вашего клиента не будет знать, что делать.

1 голос
/ 23 марта 2012

В Windows Forms вы можете отправлять необработанные исключения (которые в противном случае могли бы вызвать всплывающее окно необработанных исключений) в ваш обработчик исключений, добавив следующее в метод Main() до вызова метода Application.Run():

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

Вы можете подписать свой обработчик на событие необработанного исключения, добавив следующее в конструктор формы или в другое место:

Application.ThreadException += myHandler;

И метод обработчика вашей формы будет выглядеть так:

void myHandler(object sender, System.Threading.ThreadExceptionEventArgs e)
{
     //do something
}

Вы можете найти больше информации об этом в msdn .

0 голосов
/ 18 января 2013

Вот решение для отображения всех необработанных исключений как управляемых, так и неуправляемых типов:

static void Main() {
    try {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
        Application.ThreadException += 
            new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
        Application.Run(new Form1());
    }
    catch (Exception ex) {
        MessageBox.Show("A fatal error has occurred.  Please contact your admin\n" +
                        "Exception type: " + ex.GetType() + "\n" +
                        "Exception Message: " + ex.Message + "\n" +
                        ex.StackTrace, "Fatal Exception");
        if (ex.InnerException != null) {
            MessageBox.Show("Inner Exception:\n" +
                            "Exception type: " + ex.InnerException.GetType() + "\n" +
                            "Exception Message: " + ex.InnerException.Message + "\n" +
                            ex.StackTrace, "Fatal Exception (inner)");
        }
    }
}

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {
    throw new Exception(e.Exception.Message, e.Exception);
}

Чтобы проверить это, я использовал C ++ / CLI, чтобы вызвать неуправляемое исключение. Они не будут перехвачены должным образом, если не присутствует вышеупомянутый обработчик Application_ThreadException.

0 голосов
/ 04 апреля 2010

Я бы использовал экранирование исключений.

Пример приложения Windows

Это показывает использование для услуг

Экранирование исключений

Является частью библиотеки enteprise и позволяет отфильтровывать исключения, а также перераспределять их, чтобы скрыть детали.

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