2008-12-14 1 views
6

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

Я работаю в MS Visual Studio C#.

С точки зрения реализации, имеет смысл поставить цикл try/catch в моем основном файле program.cs, где работает приложение? Как это:

 try 
     { 
      Application.Run(new myMainForm()); 
     } 
     catch (Exception ex) 
     { 
      //the code to build the report I want to send and to 
      //pop up the Problem Report form and ask the user to send 

     } 

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

-Adeena

ответ

9

Я думаю, что вы правы, вы не знаете, что пойдет не так, что точка.

Однако вы можете также рассмотреть возможность добавления обработчика события ThreadException.

Код выше будет работать, но будут сценарии, в которых многопоточность может быть проблемой с таким кодом, поскольку не весь код внутри вашей программы оконных форм будет работать в основном потоке цикла Application.Run.

Вот пример кода из связанного статьи:

[STAThread] 
static void Main() 
{ 
    System.Windows.Forms.Application.ThreadException += new ThreadExceptionEventHandler(ReportError); 
    System.Windows.Forms.Application.Run(new MainForm()); 
} 

private static void ReportError(object sender, ThreadExceptionEventArgs e) 
{ 
    using (ReportErrorDialog errorDlg = new ReportErrorDialog(e.Exception)) 
    { 
    errorDlg.ShowDialog(); 
    } 
} 

Больше документации on MSDN.

В незначительной точке использование события ThreadException также позволяет продолжить цикл вашего основного сообщения, если исключение не является фатальным (например, сценарии отказоустойчивости), в то время как для подхода try/catch может потребоваться перезапуск основного который может вызвать побочные эффекты.

+0

Нужно ли использовать код внутри функции «ReportError»? (Т.е., ReportErrorDialog) или я могу заменить его собственным кодом (который является формой для сообщения о проблеме)? – adeena 2008-12-14 21:18:07

+0

Вы можете использовать любой код внутри ReportError, это обычное событие. – chakrit 2008-12-15 03:06:35

1

С точки зрения реализации, имеет смысл поставить цикл try/catch в моем основном файле program.cs, где работает приложение?

Обязательно и всегда.

Вы должны использовать Try/Catch-Blocks везде, где вы делаете что-то критическое, что может вызвать исключение.

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

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

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

Некоторые из них используют Try/Catch для управления выполнением программы.Этого следует избегать везде, где это возможно, из-за того, что причиной возникновения исключения является убийца с производительностью номер 1.

1

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

При использовании попытки и улавливания каждого метода трудно поддерживать.

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

try 
     { 
      //Code that could error here 
     } 
     catch (FormatException ex) 
     { 
      //Code to tell user of their error 
      //all other errors will be handled 
      //by the global error handler 
     } 

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

Глобальные обработчики ошибок поймают все остальное. Вы можете использовать эти зацепив обработчик событий в System.Windows.Forms.Application.ThreadException два события (see MSDN) и AppDomain.UnhandledException (see MSDN)

Имейте в виде, что из исключений памяти и StackOverflowException не могут быть пойманы любым ошибка ловить.

0

Лучшим подходом является пение для AppDomain.UnhandledException и Application.ThreadException В основной функции приложения. Это позволит вам записывать любые необработанные исключения в вашем приложении. Проскальзывание в блоке try catch не улавливает все.

0

Если вы просто хотите захватить аварийные ситуации, то проигнорируйте все ошибки и позвольте DrWatson генерировать мини-накопитель для вас. Затем вы можете посмотреть на этот отладчик ina (windbg предпочтительнее для мини-дисков), и он покажет вам строку, в которой ваш код поступил неправильно, а также все параметры, трассировку стека и регистры. Вы можете установить Drwatson для создания полного дампа, в котором вы получите весь дамп ядра памяти для исследования.

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

Отправка мини-насоса для вас - другое дело, хотя, here's an article, вам нужно будет сделать некоторую работу, чтобы отправить ее по электронной почте/http/ftp/etc.

1

Если вы хотите автоматически получать трассировки стека, Microsoft разрешает вам отправлять их через службы отчетов об ошибках. Все, что вам нужно сделать, это зарегистрировать цифровой сертификат от VeriSign и зарегистрировать его (бесплатно) с Microsoft.

Microsoft затем дает вам логин для загрузки мини-дампов с веб-сайта, которые отправляются, когда пользователь нажимает «Отправить отчет об ошибке».

Хотя люди могут нажать «Не отправлять», по крайней мере, это диалоговое окно Microsoft и, возможно, не одно, которое вам нужно закодировать самостоятельно. Он будет работать 24/7, вам не придется беспокоиться о сроках работы вашего веб-сервера. И вы можете предоставить подробные сведения об обслуживании пользователей, и вы можете доставлять обновления через Центр обновления Windows.

Информация об этом сервисе находится в этой статье "Windows Error Reporting: Getting Started".