Исключение не будет перехвачено, если я не отлажу приложение

#c# #debugging #exception

#c# #отладка #исключение

Вопрос:

Есть две библиотеки DLL, A и B, в A.DLL существует класс form, подобный этому:

 namespace AAA
public class AForm: Form
{
  ...
  private void btnOK_Click(object sender, EventArgs e)
  {
      DoSomeSth();
  }
}
  

В B.DLL есть некоторый код, подобный этому

 try
{
   AForm dlg = new AAA.AForm();
   dlg.ShowDialog();    
}
catch(Exception ex)
{
   MessageBox.Show(ex.Message);
}
  

В функции будет исключение через некоторое время после нажатия кнопки OK
Когда я отлаживаю код с использованием vs2005, исключение может быть перехвачено в B.DLL , но если я запустил приложение напрямую без отладки, исключение не будет перехвачено в B.DLL в чем причина?

Комментарии:

1. Где генерируется исключение? Где код для этого? В вопросе недостаточно информации для ответа.

2. Хороший вопрос, я могу воспроизвести это.

3. Под отладкой вы подразумеваете, что вы подключаете отладчик, или код компилируется в режиме отладки, а не release?

4. @Теофанис Пантелидес: отладка в отладчике VS, да.

5. @zespri Debug> Исключения> Сбросить все; и повторите попытку исключения. И мы возьмем это оттуда.

Ответ №1:

Это известная проблема. Согласно статье KB:

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

Однако, если вы запускаете свое приложение Windows Forms с помощью отладчика, вы не перехватываете исключение, потому что используете NativeWindow.Метод DebuggableCallBack. Когда вы используете NativeWindow.Метод DebuggableCallBack, отладчик точно в срок (JIT) останавливает запуск приложения.