In caso di un'eccezione non gestita C++ voglio stampare:Posso decodificare un'eccezione C++ da un'eccezione di Windows SEH? (? E se sì, come)
- Il messaggio (
what()
) della deroga - Una traccia dello stack C++.
Al fine di ottenere la traccia dello stack, sto usando SetUnhandledExceptionFilter
in combinazione con il StackWalker libreria:
struct FooStackWalker : StackWalker
{
virtual void OnCallstackEntry(CallstackEntryType, CallstackEntry &entry) override
{
std::cerr << entry.lineFileName << " (" << entry.lineNumber << "): " << entry.undFullName << std::endl;
}
};
LONG WINAPI UnhandledExceptionHandler(LPEXCEPTION_POINTERS pointers)
{
FooStackWalker walker;
walker.ShowCallstack(::GetCurrentThread(), pointers->ContextRecord);
::TerminateProcess(::GetCurrentProcess(), 1);
}
int main()
{
::SetUnhandledExceptionFilter(UnhandledExceptionHandler);
}
ho ottenuto l'analisi dello stack per stampare bene, ma ora ottenendo what
è difficile.
Esiste un modo per decodificare l'eccezione SEH come eccezione C++ per chiamare questa funzione membro prima della conclusione?
Otterrai 3 parole ExceptionInformation. Il 2 ° è un puntatore all'oggetto eccezione. Non hai alcuna speranza di interpretarlo, niente di simile a una riflessione in C++. I filtri di eccezione emessi dalla parola chiave * catch * sono cruciali. –
@Hans: se si assume che la cosa generata deriva sempre da 'std :: exception' (che è vera per molte codebase), non può essere interpretata? Una volta che hai una 'std :: exception' puoi' dynamic_cast' verso i tipi di eccezione specifici se necessario ... –
Invia a * what * exception? Questa è la chiave. Potresti ottenere * cosa *. –