2009-11-17 3 views
4

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

try{ 
    ... 
} 
catch (Exception exception){ 
    MessageBox.Show(exception.Message, "Error!"); 
    MyLogger.Log(exception.Message); 
} 

Теперь я хотел бы сделать это правильно, и есть некоторые вопросы по этому поводу:

  1. Какие исключения я должен поймать (например, FileNotExists для обработки файлов, но зачем TableAdapter или ReportClass (CrystalReports))
  2. Где можно увидеть список исключений, что объекты могут бросать (для ample TableAdapter)
  3. В приложении Windows Forms я могу установить статический метод, который будет регистрировать любое исключение в файле, например
  4. Любые другие предложения?

ответ

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

  2. Они должны быть найдены в описании функций в MSDN (вам придется искать их на каждом из них). Для пользовательских функций вам нужно будет копать, если нет дополнительной документации или итогового комментария.

3, 4. Рассмотрите возможность использования logging library for .NET

+0

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

+0

Любые *** хорошие шаблоны и методы *** (возможно, в MSDN -Microsoft) о _Logging и Exception в Windows Forms_ ('UnhandledException, Application.ThreadException events' и т. Д.)? – Kiquenet

+0

http://stackoverflow.com/questions/1715439/best-logging-library-for-net/1715446#1715446 *** НЕ найден *** – Kiquenet

1

Вы должны только перехватывать исключения, о которых вы можете что-то сделать.

Это эмпирическое правило. Обычно у меня есть попытка/уловка вокруг моего Program.Main на случай, если исключение пузырьков прямо вверху и нуждается в регистрации. Вы также можете обрабатывать событие CurrentDomain_UnhandledException, если исключения выбраны в других потоках, кроме потока пользовательского интерфейса (при условии, что вы многопоточность).

2
  1. Это до вас, чтобы решить, какие исключения ваша логика приложения может разумно ожидать, чтобы оправиться.
  2. Исключения вызывают вызовы метода, а не объекты. В Visual Studio объяснения Intellisense расскажут вам, какие исключения выбрасываются объектом (при условии, что документация XML описывает, какие исключения вызывается методом.
  3. Вместо использования статического метода ответьте на событие Application.ThreadException. имеет примеры. MSDN
5

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

try 
{ 
    ... 
} 
catch (Exception exception) 
{  
    MyLogger.Log(exception.Message); 

    throw; 
}
2

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

(получил образец VB здесь, но я надеюсь, вы получаете значение)

Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException 

    End Sub 

Вы можете найти события приложения в вариантах вашего проекта.

1

В ответ на «4. Любые другие предложения?»:

В вашем примере кода, окно сообщения отображается перед входом исключение. Я бы порекомендовал регистрировать исключение перед отображением сообщения, на случай, если пользователь увидит сообщение об ошибке, панику и отправится в отпуск, не нажав «ОК». Это незначительная вещь, но окна сообщений блокируют программу на неопределенный срок и должны использоваться с осторожностью!

Смежные вопросы