Vra

Ek het 'n MFC aansoek saamgestel met / CLR en ek probeer om 'n finale hanteerder te implementeer vir anders un-gevang bestuur uitsonderings. Vir moedertaal uitsonderings, oorheersende CWinApp::ProcessWndProcException werk.

Die twee gebeurtenisse in Jeff se CodeProject artikel , Application.ThreadException en AppDomain.CurrentDomain.UnhandledException voorgestel, nie opgewek word nie.

Kan iemand raai 'n manier om 'n finale bestuur uitsondering hanteerder vir 'n gemengde uitvoerbare voorsien?


Update:

Dit wil voorkom asof hierdie uitsondering hanteerders net veroorsaak stroomaf van Application.Run of soortgelyke (daar is 'n werker draad smaak, kan nie onthou die naam.) As jy wil werklik wêreldwyd vang 'n bestuurde uitsondering wat jy doen moet 'n SEH filter installeer . Jy gaan nie na 'n System.Exception kry en as jy 'n callstack wil jy gaan hê om jou eie Walker rol.

In 'n MSDN Forum vraag oor hierdie onderwerp is daar voorgestel om 'n voldoende lae-vlak punt van die belangrikste MFC draad ignoreer in 'n try ... catch (Exception^). Byvoorbeeld, CWinApp::Run. Dit kan 'n goeie oplossing wees, maar ek het nie gekyk na enige perf of stabiliteit implikasies. Jy sal 'n kans om aan te meld met 'n oproep stapel voor jy borgtog en jy kan die standaard vensters unahndled uitsondering gedrag te vermy kry.

Was dit nuttig?

Oplossing

Neem 'n blik rondom die Inter, sal jy vind dat jy nodig het om 'n filter te installeer om die onbeheerde uitsonderings verby die filters op hul manier om jou AppDomain kry. Van CLR en verwerkte uitsondering Filters :

  

Die CLR maak staat op die SEH verwerkte uitsondering filter meganisme om verwerkte vang uitsonderings.

Ander wenke

  

Die gebruik van dié twee uitsondering hanteerders moet werk.

Hoekom "moet?"

Die gebeure word nie opgewek met behulp van die onderstaande:

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;
}

Die gebruik van dié twee uitsondering hanteerders moet werk. Is jy seker jy hulle het bygevoeg in 'n plek waar hulle gaan genoem word en korrek op te stel (dit wil sê, in jou aansoek bestuur beginpunt - jy het stel 'n in, regs)

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top