2008-08-12 6 views
6

У меня есть приложение MFC, скомпилированное с/clr, и я пытаюсь реализовать конечный обработчик для других исключенных управляемых исключений. Для нативных исключений выполняется переопределение CWinApp::ProcessWndProcException.Завершенный обработчик исключений в смешанном исполняемом файле/управляемом?

Два события, предложенные в Jeff's CodeProject article, Application.ThreadException и AppDomain.CurrentDomain.UnhandledException, не поднимаются.

Может ли кто-нибудь предложить способ предоставления конечного обработчика обработанных исключений для смешанного исполняемого файла?


Update:

Оказывается, что эти обработчики исключений срабатывает только вниз по течению от Application.Run или аналогичный (. Есть рабочий поток аромат, не помню название) Если вы хотите по-настоящему глобально поймать вы должны установить фильтр SEH. Вы не получите System.Exception, и если вам нужен стоп-колл, который вам понадобится, чтобы перевернуть свой собственный ходок.

В вопросе форума MSDN на эту тему было предложено переопределить достаточно низкую точку основного потока MFC в try ... catch (Exception^). Например, CWinApp::Run. Это может быть хорошим решением, но я не смотрел ни на какие перфомансы или последствия для стабильности. Вы получите возможность войти в систему со стеком вызовов до того, как вы заработаете, и вы можете избежать поведения исключаемых исключений по умолчанию.

+0

Возможно, это поможет нам узнать больше об исключениях, которые бросаются, которые не пойманы двумя событиями, которые вы упомянули? – Charlie 2008-10-13 20:58:31

+0

Любая управляемая исключение вообще - любой наследник System :: Exception. Точка вышеперечисленных событий - это срабатывание, когда/any/управляемое исключение не реализовано. – 2008-10-23 11:16:33

ответ

2

Взглянув вокруг интернетах, вы обнаружите, что вам нужно установить фильтр, чтобы получить неуправляемые исключения прохождения фильтров на пути к ваш AppDomain. От CLR and Unhandled Exception Filters:

CLR опирается на механизм необработанного исключения SEH, чтобы поймать необработанные исключения.

0

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

1

Использование этих двух обработчиков исключений должно работать.

Почему «должен?»?

События не воскресают с помощью ниже:

extern "C" void wWinMainCRTStartup(); 

// managed entry point 
[System::STAThread] 
int managedEntry(void) 
{ 
    FinalExceptionHandler^ handler = gcnew FinalExceptionHandler(); 

    Application::ThreadException += gcnew System::Threading::ThreadExceptionEventHandler(
             handler, 
             &FinalExceptionHandler::OnThreadException); 

    AppDomain::CurrentDomain->UnhandledException += gcnew UnhandledExceptionEventHandler(
                 handler, 
                 &FinalExceptionHandler::OnAppDomainException); 

    wWinMainCRTStartup(); 

    return 0; 
} 

// final thread exception handler implementation 
void FinalExceptionHandler::OnThreadException(Object^ /* sender */, System::Threading::ThreadExceptionEventArgs^ t) 
{ 
    LogWrapper::log->Error("Unhandled managed thread exception.", t->Exception); 
} 

// final appdomain exception handler implementation 
void FinalExceptionHandler::OnAppDomainException(System::Object ^, UnhandledExceptionEventArgs ^args) 
{ 
    LogWrapper::log->Error("Unhandled managed appdomain exception.", (Exception^)(args->ExceptionObject)); 
} 

BOOL CMyApp::InitInstance() 
{ 
    throw gcnew Exception("test unhandled"); 
    return TRUE; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^