W razie nieobsługiwany wyjątek C++ chcę wydrukować:Czy mogę odszyfrować wyjątek C++ z wyjątku Windows SEH? (? A jeśli tak, to w jaki sposób)
- Komunikat (
what()
) z C++ wyjątkiem - ślad stosu.
aby uzyskać ślad stosu, używam SetUnhandledExceptionFilter
w połączeniu z StackWalker Biblioteka:
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);
}
stałam ślad stosu do wydrukowania po prostu w porządku, ale teraz jest coraz what
trudny.
Czy jest jakiś sposób mogę odszyfrować wyjątek SEH jako wyjątek C++, aby wywołać tę funkcję członka przed zakończeniem?
Otrzymasz 3 słowa ExceptionInformation. Druga to wskaźnik do obiektu wyjątku. Nie masz nadziei na jej interpretację, nie ma czegoś takiego jak odbicie w C++. Filtry wyjątków emitowane przez słowo kluczowe * catch * są kluczowe. –
@Hans: Jeśli założymy, że rzecz wyrzucona zawsze pochodzi od 'std :: exception' (co jest prawdą w wielu bazach kodów), to czy nie można tego zinterpretować? Gdy masz 'std :: exception' możesz' dynamic_cast' w dół do określonych typów wyjątków, jeśli trzeba ... –
Prześlij na * co * wyjątek? To jest klucz. Możesz dostać * co *. –