Instrumentul de tratare a excepțiilor gestionat final într-un executabil mixt/gestionat?

Am o aplicație MFC compilată cu/clr și încerc să pun în aplicare un handler final pentru alte excepții excepționale gestionate. Pentru excepțiile native, funcționarea CWinApp :: ProcessWndProcException funcționează.

Cele două evenimente sugerate în articolul CodeProject al lui Jeff, Application.ThreadException și AppDomain.CurrentDomain.UnhandledException , nu sunt ridicate.

Poate cineva să sugereze o modalitate de a oferi un handler de excepție gestionat definitiv pentru un executabil mixt?


Actualizați:

Se pare că acești agenți de tratare a excepțiilor sunt declanșați numai în aval de Application.Run sau similar (există o aromă a firului de lucru, nu-mi amintesc numele.) Dacă doriți să capturați cu adevărat o excepție trebuie să instalați un filtru SEH. Nu veți primi un System.Exception și dacă doriți o convorbire de apel, va trebui să vă răsturnați propriul Walker.

Într-o întrebare pe forumul MSDN pe această temă, sa sugerat să înlocuiți un punct de nivel suficient de scăzut al firului principal MFC într-un try ... catch (Exception ^) . De exemplu, CWinApp :: Run . Aceasta poate fi o soluție bună, dar nu m-am uitat la niciun fel de implicații pentru perf și stabilitate. Veți primi o șansă de a vă conecta cu un stack de apel înainte de a vă elibera din cauțiune și puteți evita comportamentul excepțional de la ferestrele implicite.

0
fr hi bn
Orice excepție gestionată - oricare moștenitor al System :: Exception. Punctul evenimentelor de mai sus este de a declanșa când excepția/orice/excepția gestionată este neîntreruptă.
adăugat autor Aidan Ryan, sursa
Poate că ne-ar ajuta să știm mai multe despre excepțiile care sunt aruncate care nu sunt prinse de cele două evenimente pe care le-ați menționat?
adăugat autor Charlie, sursa

3 răspunsuri

Utilizarea acelor două dispozitive de tratare a excepțiilor ar trebui să funcționeze.

De ce ar trebui?"

Evenimentele nu sunt ridicate folosind următoarele:

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;
}
0
adăugat

Privind în jurul rețelelor, veți găsi că trebuie să instalați un filtru pentru a obține excepțiile neadministrate care trec filtrele în drum spre AppDomain. Din CLR și filtre de excepție nefolosite :

CLR se bazează pe mecanismul de filtrare a excepțiilor neinstrumentate SEH pentru a prinde excepții nefolosite.

0
adăugat

Utilizarea acelor două dispozitive de tratare a excepțiilor ar trebui să funcționeze. Sunteți sigur că le-ați adăugat într-un loc în care vor fi chemați și setați corespunzător (adică, în punctul de intrare gestionat al aplicației - ați pus unul, nu?)

0
adăugat
Cred că problema este că nu există nicio aplicație.
adăugat autor Aidan Ryan, sursa