【发布时间】:2012-10-20 07:52:19
【问题描述】:
如果出现未处理的 C++ 异常,我想打印:
- C++ 异常的消息 (
what()) - 堆栈跟踪。
为了获取堆栈跟踪,我将SetUnhandledExceptionFilter 与StackWalker 库结合使用:
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);
}
我已经可以很好地打印堆栈跟踪,但现在很难获得what。
有什么方法可以将 SEH 异常解码为 C++ 异常,以便在终止之前调用此成员函数?
【问题讨论】:
-
你会得到 3 个 ExceptionInformation 词。第二个是指向异常对象的指针。你没有解释它的希望,没有 C++ 中的反射之类的东西。 catch 关键字发出的异常过滤器至关重要。
-
@Hans:如果假设抛出的东西总是源自
std::exception(对于许多代码库来说都是如此),它不能被解释吗?一旦你有了std::exception,如果需要,你可以dynamic_cast到特定的异常类型... -
强制转换为 what 异常?那是关键。你可能会得到what。
-
@Hans:这是一个
void *——不能只是static_cast到std::exception*吗?
标签: c++ winapi visual-c++ exception