Pergunta

Eu tenho um aplicativo MFC compilado com o /clr e eu estou tentando implementar um final manipulador para o contrário onu-pego gerenciado exceções.Para os nativos exceções, substituindo CWinApp::ProcessWndProcException de obras.

Os dois eventos sugerido na Jeff CodeProject artigo,Application.ThreadException e AppDomain.CurrentDomain.UnhandledException, não são levantadas.

Alguém pode sugerir um caminho para proporcionar um final conseguiu manipulador de exceção para um misto executável?


Atualização:

Parece que esses manipuladores de exceção são disparados somente a jusante de Application.Run ou similar (há um thread de trabalho sabor, não consigo lembrar o nome.) Se você realmente quer globalmente pegar uma exceção gerenciado que você precisa para instalar um SEH filtro.Você não está indo para obter um System.Exception e se você quiser uma pilha de chamadas, você vai ter que rolar o seu próprio walker.

Em um fórum MSDN pergunta sobre este tópico foi sugerido para substituir suficientemente baixo nível de ponto dos principais MFC thread em um try ... catch (Exception^).Por exemplo, CWinApp::Run.Esta pode ser uma boa solução, mas eu não olhei em qualquer de desempenho ou estabilidade implicações.Você vai ter uma chance para fazer logon com uma pilha de chamadas antes de fiança e você pode evitar o default do windows unahndled exceção de comportamento.

Foi útil?

Solução

Dar uma olhada em torno da internet, você vai encontrar o que você precisa para instalar um filtro para obter gerido exceções passando os filtros em seu caminho para o seu Domínio de aplicação.A partir de CLR e Filtros de Exceção sem tratamento:

O CLR depende do SEH filtro de excepção não processada mecanismo para capturar exceções sem tratamento.

Outras dicas

Usando os dois manipuladores de exceção deve funcionar.

Por que "deveria?"

Os eventos não são gerados usando o abaixo:

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

Usando os dois manipuladores de exceção deve funcionar.Tem certeza de que você adicionou-los em um lugar onde eles estão indo para ser chamado e definir corretamente (ou seja, na sua aplicação a gerenciado ponto de entrada-você fez colocar um em um, certo?)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top