通过catch(...)从SEH异常中获取有意义的信息?

时间:2017-05-05 13:07:19

标签: c++ seh

早上好!

编辑:这不是重复,因为它特别适用于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;
}

1 个答案:

答案 0 :(得分:7)

使用catch (...)您根本得不到任何信息,无论是关于C ++异常还是SEH。所以全球处理程序不是解决方案。

但是,只要您还使用set_se_translator(),您就可以通过C ++异常处理程序(catch)获取SEH信息。 catch的类型应该与您在翻译器中构建和抛出的C ++异常相匹配。

  

您编写的函数必须是本机编译的函数(不使用/ clr编译)。它必须采用无符号整数和指向Win32 _EXCEPTION_POINTERS结构的指针作为参数。参数是分别调用Win32 API GetExceptionCodeGetExceptionInformation函数的返回值。

或者您可以使用特定于SEH的__try / __except。它们可以在C ++中使用,包括在使用C ++异常的程序中,只要你在同一个函数中没有SEH __try和C ++ try(以捕获这两种类型的异常)在同一个块中,使用辅助函数)。