Запрет "Отправить отчет об ошибке в Microsoft" - PullRequest
9 голосов
/ 23 января 2009

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

Ответы [ 6 ]

5 голосов
/ 23 января 2009

Это то, что мы сделали.

static void Main() {
    try
    {
        SubMain();
    }
    catch (Exception e)
    {
        HandleUnhandledException(e);
    }
}

private static void SubMain()
{
    // Setup unhandled exception handlers
    AppDomain.CurrentDomain.UnhandledException += // CLR
       new UnhandledExceptionEventHandler(OnUnhandledException);
     Application.ThreadException += // Windows Forms
       new System.Threading.ThreadExceptionEventHandler(
           OnGuiUnhandledException);
     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);
     Application.Run(new frmMain());
}

// CLR unhandled exception
private static void OnUnhandledException(Object sender,
   UnhandledExceptionEventArgs e)
{
    HandleUnhandledException(e.ExceptionObject);
}

// Windows Forms unhandled exception
private static void OnGuiUnhandledException(Object sender,
   System.Threading.ThreadExceptionEventArgs e)
{
    HandleUnhandledException(e.Exception);
}
3 голосов
/ 23 января 2009

Вы как бы ответили на свой вопрос. Лучший способ предотвратить появление диалога об ошибках - это написать код, который обрабатывает ваши исключения, чтобы диалог никогда не появлялся. Держу пари, это то, что предложил бы Раймонд Чен (если я буду таким смелым).

1 голос
/ 25 апреля 2009

Если вы используете .NET Framework 2.0 или более позднюю версию и существует необработанное исключение из рабочего потока, я считаю, что вам не повезло. В .NET 1.0 и 1.1 CLR просто проглотил исключение из потока, отличного от основного потока. Однако это было изменено в .NET 2.0, где необработанное исключение в потоке приводит к закрытию приложения.

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

Хотя я бы не рекомендовал это, есть способ вернуться к тому, как ведут себя CLR 1.0 и 1.1, установив флаг совместимости приложений в файле конфигурации приложения.

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

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

1 голос
/ 23 января 2009

http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

Хотя, если вы выпускаете это как коммерческий проект, я рекомендую вам зарегистрироваться в Microsoft, чтобы вы могли получить информацию о сбоях и отчетах об ошибках, отправляемых в MS

0 голосов
/ 24 апреля 2009

Если ваш вопрос касался приложения WinForms, то выбранный ответ будет работать для вас, однако он не совсем элегантный.

.NET предоставляет помощника для этого точного сценария:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf CurrentDomain_UnhandledException

А вот документация MSDN по методу

0 голосов
/ 23 января 2009

Вы можете попробовать поиграть с HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug

Этот совет от Др.Ватсона дней ... может или не может работать.

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