Всем привет
значит если написать такой код в главном потоке
throw "bad"
то появляется окно с каллстеком все как полагается
сообщающее System.Runtime.InteropServices.SEHException
так же если вызвать из бэкграунд потока код через Invoke
который так кинет исключение то снова появится окно с каллстеком...
а вот если в самом бэкграунд потоке бросить исключение throw "bad"
то сразу же появляется
Microsoft Visual C++ Runtime Library
Runtime Error!
и просто ничего не сообщая прибивает программу
у меня в программе подписаны обработчики на необработанные исключения
AppDomain::CurrentDomain->UnhandledException += gcnew
UnhandledExceptionEventHandler(gcnew CatchException, &CatchException::UnhandledException);
Application::ThreadException += gcnew
ThreadExceptionEventHandler(gcnew CatchException, &CatchException::ThreadException);
так вот в этом случае прога просто прибивается и никакие обработчики не вызываются...
я компилирую в режиме /clr а вот если переключить в режим /clr:pure то и для бэкгрунд потоков
начинает показываться полный каллстек до процедуры вызвавшей throw "bad"...
почему такое происходит ? почему один и тот де код throw "bad" в основном потоке преобразуется в исключение
System.Runtime.InteropServices.SEHException и показывается полный каллстек а в бэкграунд потоках этот код вызывает
Microsoft Visual C++ Runtime Library
Runtime Error!
и без объяснений прибивает программу...
и почему при включение /clr:pure исключения начинают преобразовываться в System.Runtime.InteropServices.SEHException
и показывать полный каллстек и для бэкграунд потоков ?
поток я создаю так... тоесть это обычный менеджед поток...
void crash_thread()
{
throw "bad";
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
//throw "bad";
Thread^ t = gcnew Thread(gcnew ThreadStart(this, &Form1::crash_thread));
t->Start();
так вот выполнение throw "bad" в потоке валит программу в
Microsoft Visual C++ Runtime Library
Runtime Error!
а вот если раскомментить //throw "bad" в хендлере кнопки то это искллючение преобразуется в
System.Runtime.InteropServices.SEHException и показывается окошко с каллстеком до самого хендлера кнопки...
причем если включить /clr:pure то и для бэкгрунд потоков начинает нормально работать...
спасибо