早上好!
编辑:这不是重复,因为它特别适用于SEH,而不是代码级抛出异常。
我使用SEH来捕获某些不可靠库引发的硬件错误。我想从捕获的例外中获取更多信息。以下代码模拟了我正在做的事情。正如您所看到的,我正在使用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;
}
答案 0 :(得分:7)
使用catch (...)
您根本得不到任何信息,无论是关于C ++异常还是SEH。所以全球处理程序不是解决方案。
但是,只要您还使用set_se_translator()
,您就可以通过C ++异常处理程序(catch
)获取SEH信息。 catch
的类型应该与您在翻译器中构建和抛出的C ++异常相匹配。
您编写的函数必须是本机编译的函数(不使用/ clr编译)。它必须采用无符号整数和指向Win32
_EXCEPTION_POINTERS
结构的指针作为参数。参数是分别调用Win32 APIGetExceptionCode
和GetExceptionInformation
函数的返回值。
或者您可以使用特定于SEH的__try
/ __except
。它们可以在C ++中使用,包括在使用C ++异常的程序中,只要你在同一个函数中没有SEH __try
和C ++ try
(以捕获这两种类型的异常)在同一个块中,使用辅助函数)。