Блоки Try / Catch в обратных вызовах событий пользовательского интерфейса - PullRequest
1 голос
/ 10 февраля 2010

Есть ли простой способ перехватывать все исключения внутри всех обратных вызовов событий пользовательского интерфейса вместо вызова try / catch в каждом обратном вызове?

Вот что я попробовал:

Обратный вызов пользовательского интерфейса:


private void btnOk_Click(object sender, EventArgs e)
{
  int x=0;
  int i=1/x;//Exception happens here.
}

точка входа:


public static void Main(string[] args)
{
  try
  {
    Application.Run(new MyForm());
  }
  catch (Exception e)
  {
    Debug.Print(e.Message);
  }
}

В DebugView я вижу исключение DivideByZero. Тем не менее, MyForm закрыт и не работает. Я надеялся, что он может сообщить об исключении и продолжить работу. Есть ли простой способ заставить MyForm отправлять исключение в Debug.Print () без необходимости добавлять try / catch непосредственно в btnOk_Click (и все другие обратные вызовы пользовательского интерфейса)?

Ответы [ 3 ]

3 голосов
/ 10 февраля 2010

Нет, нет - и не стоит пытаться.

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

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

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

0 голосов
/ 10 февраля 2010

Да, есть.

Из MSDN:

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx

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

Например, в локальном блоке всегда следует указывать:

try {
...
catch( TypeOfKnownCommonException ex ) {
...
}

Глобальная ловушка действительно должна использоватьсятолько для реализации настраиваемого диалогового окна ошибок и изящной очистки (отсюда и либеральное использование try / finally) и предотвращения появления диалогового окна ошибок Microsoft.

0 голосов
/ 10 февраля 2010

Вы можете использовать для этого Postsharp.

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

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