Столкнулся с вот каким траблом. Не пойму это я что то не так сделал или баг какой в .Net
Есть main в оконном приложении
static void Main(string [] args)
{
statiс void Main(..)
{
try{
form.ShowDialog;
......
}
catch{.....}
}
}
в обработчике некоего события в каком то контролле возникает exception
так вот под дебагером он перехватываеться в Main, а если не под дебагером — после поднятия ексепшена тормозит сек. 7 а затем
вылетает, и не перехватываеться в Main !!!
Я в тупике можно сказать. Что сделать что бы все это заработало.
Здравствуйте, Maxeemus, Вы писали:
M>Столкнулся с вот каким траблом. Не пойму это я что то не так сделал или баг какой в .Net
M>Есть main в оконном приложении
M>M>static void Main(string [] args)
M>{
M> statiс void Main(..)
M> {
M> try{
M> form.ShowDialog;
M> ......
M> }
M> catch{.....}
M> }
M>}
M>
M>в обработчике некоего события в каком то контролле возникает exception
M>так вот под дебагером он перехватываеться в Main, а если не под дебагером — после поднятия ексепшена тормозит сек. 7 а затем
M>вылетает, и не перехватываеться в Main !!!
M>Я в тупике можно сказать. Что сделать что бы все это заработало.
Вот сам нашел
здесь. Помогло. Странно все это.
Здравствуйте, Maxeemus, Вы писали:
M>Вот сам нашел здесь. Помогло. Странно все это.
Это значит, что исключение у тебя происходит в другом потоке. Соответственно стек там свой и при раскручивании исключения оно в Main не попадает.
По хорошему ты должен подписаться на еще одно событие:
Application.ThreadException += new ThreadExceptionEventHandler(ThreadExceptionHandler);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionHandler);
[RSDN@Home 1.1 beta 1] Сейчас 22:28, слушаю тишину
M>[STAThread]
M>static void Main(string [] args)
M>
... << RSDN@Home 1.1 beta 1 >>
O>Это значит, что исключение у тебя происходит в другом потоке. Соответственно стек там свой и при раскручивании исключения оно в Main не попадает.
O>По хорошему ты должен подписаться на еще одно событие:
O>O> Application.ThreadException += new ThreadExceptionEventHandler(ThreadExceptionHandler);
O> AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionHandler);
O>
Тестовый код:
static void Main()
{
try
{
Thread.CurrentThread.Name = "opa";
Application.Run(new Form1());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public partial class Form1 : Form
{
public Form1()
{
// throw new Exception(Thread.CurrentThread.Name); // первый вариант
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// throw new Exception(Thread.CurrentThread.Name); // второй вариант
}
}
При запуске из под студии все варианты исключений ловятся, как полагается.
Если же запускать без студии, то в первом варианте все работает аналогично, а во втором исключение не перехватывается и
вылазиет окно Unhandled exception. В сообщении исключения всегда присвоенное имя потока.
С решением в виде обработчика Application.ThreadException все понятно.
Интересна причина такого поведения. Где тут собака ?