Bil*_*eal 14 c++ winapi exception visual-c++
如果出现未处理的C++异常,我想打印:
what()C++异常的message()为了获得堆栈跟踪,我正在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);
}
Run Code Online (Sandbox Code Playgroud)
我已经让堆栈跟踪打印得很好,但现在变得what困难了.
有没有什么方法可以将SEH异常解码为C++异常,以便在终止之前调用此成员函数?
为什么不使用已经为您提供异常详细信息的 C++ 机制呢?它与 SEH 过滤器不互斥(尽管它与)互斥SetUnhandledExceptionFilter。您只需正确嵌套处理程序:
int main()
{
try {
return cppexcept_main();
}
catch (const std::exception& e)
{
//use e.what()
}
}
int cppexcept_main()
{
__try {
return application_main();
}
__except(GrabStackTrace(GetExceptionInformation()), EXCEPTION_CONTINUE_SEARCH) {
/* never reached due to EXCEPTION_CONTINUE_SEARCH */
}
}
Run Code Online (Sandbox Code Playgroud)