早上好!
编辑:这不是重复的,因为它具体涉及 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;
}
Using catch (...)
你根本得不到任何信息,无论是关于 C++ 异常还是 SEH。所以全局处理程序不是解决方案。
但是,您可以通过 C++ 异常处理程序获取 SEH 信息(catch
),只要您还使用set_se_translator() https://msdn.microsoft.com/en-us/library/5z4bw5h5.aspx。的类型catch
应该与翻译器内部构建和抛出的 C++ 异常相匹配。
您编写的函数必须是本机编译的函数(不是使用 /clr 编译的)。它必须采用无符号整数和指向 Win32 的指针_EXCEPTION_POINTERS
结构作为参数。参数是调用 Win32 API 的返回值GetExceptionCode
and GetExceptionInformation
函数,分别。
或者你可以使用__try
/__except
,这是特定于 SEH 的。只要您没有 SEH,它们就可以在 C++ 内部使用,包括在使用 C++ 异常的程序中__try
和C++try
在同一函数中(要在同一块中捕获两种类型的异常,请使用辅助函数)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)