早上好!
编辑:这不是重复,因为它特别适用于SEH,而不是代码级抛出的异常.
我正在使用SEH来捕获一些不可靠库引发的硬件错误.我想从catchall异常中获取更多信息.以下代码模拟了我正在做的事情.正如您所看到的,我正在使用boost的current_exception_diagnostic_information,但它只是吐出"没有可用的诊断信息". - 不是非常有帮助.
是否有可能至少获得在没有捕获到异常的情况下返回的终止代码?(在这种情况下为0xC0000005,访问冲突)
#include "stdafx.h"
#include <future>
#include <iostream>
#include <boost/exception/diagnostic_information.hpp>
int slowTask()
{
//simulates a dodgy bit of code
int* a = new int[5]();
a[9000009] = 3;
std::cout << a[9000009];
return 0;
}
int main()
{
{
try
{
std::future<int> result(std::async(slowTask));
std::cout<< result.get();
}
catch(...)
{
std::cout << "Something has gone dreadfully wrong:"
<< boost::current_exception_diagnostic_information()
<< ":That's all I know."
<< std::endl;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用catch (...)您完全没有任何信息,无论是关于C++异常还是SEH.因此全球处理程序不是解决方案.
但是,catch只要您也使用,您就可以通过C++异常处理程序()获取SEH信息set_se_translator().该类型catch应与您在翻译器中构建和抛出的C++异常相匹配.
您编写的函数必须是本机编译的函数(不使用/ clr编译).它必须采用无符号整数和指向Win32
_EXCEPTION_POINTERS结构的指针作为参数.参数分别是对Win32 APIGetExceptionCode和GetExceptionInformation函数的调用的返回值.
或者你可以使用__try/ __except,这是SEH特有的.它们可以在C++中使用,包括在使用C++异常的程序中,只要你在同一个函数中没有SEH __try和C++ try(在同一个块中捕获两种类型的异常,使用辅助函数) .
| 归档时间: |
|
| 查看次数: |
1142 次 |
| 最近记录: |