#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) останавливает запуск приложения.