通过 catch(...) 从 SEH 异常中获取有意义的信息?
Get meaningful information from SEH exception via catch(...)?
早上好!
编辑:这不是重复的,因为它专门与 SEH 有关,而不是代码级抛出的异常。
我正在使用 SEH 来捕获一些不可靠的库抛出的硬件错误。我想从 catchall 异常中获取更多信息。下面的代码模拟了我在做什么。如您所见,我正在使用 boost 的 current_exception_diagnostic_information,但它只是吐出 "No diagnostic information available." - 不是很有帮助。
是否有可能至少获得如果未捕获异常会返回的终止代码? (在本例中为 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;
}
使用 catch (...)
你根本得不到任何信息,无论是关于 C++ 异常还是 SEH。所以全局处理程序不是解决方案。
但是,只要您还使用 set_se_translator()
,您就可以通过 C++ 异常处理程序 (catch
) 获取 SEH 信息。 catch
的类型应该与编译器中构建和抛出的 C++ 异常相匹配。
The function that you write must be a native-compiled function (not compiled with /clr). It must take an unsigned integer and a pointer to a Win32 _EXCEPTION_POINTERS
structure as arguments. The arguments are the return values of calls to the Win32 API GetExceptionCode
and GetExceptionInformation
functions, respectively.
或者你可以使用__try
/__except
,这是SEH特有的。它们可以在 C++ 中很好地使用,包括在使用 C++ 异常的程序中,只要您在同一函数中没有 SEH __try
和 C++ try
(以捕获两种类型的异常在同一块中,使用辅助函数)。
早上好!
编辑:这不是重复的,因为它专门与 SEH 有关,而不是代码级抛出的异常。
我正在使用 SEH 来捕获一些不可靠的库抛出的硬件错误。我想从 catchall 异常中获取更多信息。下面的代码模拟了我在做什么。如您所见,我正在使用 boost 的 current_exception_diagnostic_information,但它只是吐出 "No diagnostic information available." - 不是很有帮助。
是否有可能至少获得如果未捕获异常会返回的终止代码? (在本例中为 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;
}
使用 catch (...)
你根本得不到任何信息,无论是关于 C++ 异常还是 SEH。所以全局处理程序不是解决方案。
但是,只要您还使用 set_se_translator()
,您就可以通过 C++ 异常处理程序 (catch
) 获取 SEH 信息。 catch
的类型应该与编译器中构建和抛出的 C++ 异常相匹配。
The function that you write must be a native-compiled function (not compiled with /clr). It must take an unsigned integer and a pointer to a Win32
_EXCEPTION_POINTERS
structure as arguments. The arguments are the return values of calls to the Win32 APIGetExceptionCode
andGetExceptionInformation
functions, respectively.
或者你可以使用__try
/__except
,这是SEH特有的。它们可以在 C++ 中很好地使用,包括在使用 C++ 异常的程序中,只要您在同一函数中没有 SEH __try
和 C++ try
(以捕获两种类型的异常在同一块中,使用辅助函数)。