我能解码一个C++;来自Windows SEH异常的异常?(如果是,怎么做?) P>在未处理的C++异常事件中,我想打印: C++异常的消息(()) 堆栈跟踪

我能解码一个C++;来自Windows SEH异常的异常?(如果是,怎么做?) P>在未处理的C++异常事件中,我想打印: C++异常的消息(()) 堆栈跟踪,c++,winapi,visual-c++,exception,C++,Winapi,Visual C++,Exception,为了获得堆栈跟踪,我将SetUnhandledExceptionFilter与库结合使用: struct FooStackWalker:StackWalker { 虚拟无效OnCallstackEntry(CallstackEntryType、CallstackEntry和entry)覆盖 { STR: < P> 编辑:我误解了你的问题。我不能确切地回答C++异常的答案,但我确信答案是“否”。我不认为有什么方法可以区分SEH引起的未处理异常(例如访问违规)。以及C++异常,或者区分不同类型C++

为了获得堆栈跟踪,我将
SetUnhandledExceptionFilter
与库结合使用:

struct FooStackWalker:StackWalker
{
虚拟无效OnCallstackEntry(CallstackEntryType、CallstackEntry和entry)覆盖
{

STR: < P> <强>编辑<强>:我误解了你的问题。我不能确切地回答C++异常的答案,但我确信答案是“否”。我不认为有什么方法可以区分SEH引起的未处理异常(例如访问违规)。以及C++异常,或者区分不同类型C++异常的方法。马已经把谷仓留在了那个。 原始答复如下:


不,因为SEH异常没有<代码>什么<代码> >它不是<代码> STD::异常< /代码>。当您试图捕捉SEH异常作为C++异常时,它只能被省略(<代码>…<代码> >)。<代码> catch < /Cald>处理程序。您可以使用自己定义的函数将SEH异常转换为C++异常,但此时您只需在不同的位置生成相同的信息,就生成自己的<代码>什么<代码>(甚至,我不知道是否可以从<代码> unHundExcel中筛选< <代码> >


您在中拥有所需的所有信息。如果发生访问冲突,则
指针->异常记录->异常代码
将是
异常访问冲突
(0xC0000005)如果发生了这个问题,那么你可以检查<代码> NoMealsPosivs>代码>异常信息< /Cord>变量,以确定它是读写冲突还是试图访问的地址。< /P> < P>为什么不使用已经给出异常细节的C++机制?它不是SEH过滤器专有的。(尽管它与
SetUnhandledExceptionFilter
是独占的)。您只需正确嵌套处理程序:

int main()
{
    try {
        return cppexcept_main();
    }
    catch (const std::exception& e)
    {
        //use e.what()
    }
}

int cppexcept_main()
{
    __try {
        return application_main();
    }
    __except(GrabStackTrace(GetExceptionInformation()), EXCEPTION_CONTINUE_SEARCH) {
         /* never reached due to EXCEPTION_CONTINUE_SEARCH */
    }
}

不,我想做相反的操作——把SEH异常转换成C++异常。当然,如果SEH异常实际上不是C++异常(MSVC++似乎使用异常代码<代码> 0xE06D7363),无论什么转换都免费地失败或以其他方式告诉我去地狱。(在这种情况下,我无论如何都不想尝试打印堆栈跟踪——在访问冲突或其他情况下,不应该尝试继续运行)。(应该注意的是,我很乐意在普通的C++代码> catch < /COD>内做这类事情,但是在那时,栈已经被解开,所以打印掉抛掷点的堆栈是不可能的)。已确认0xE06D7363:该信息用于调试/诊断目的。您的程序不应依赖它,因为它可以随时更改。@Raymond:我知道--这就是为什么我要问这个问题--以了解是否有支持的方法来执行此操作。(除非我重新编译和更改CRT,否则,它不会改变——毕竟,解释异常的所有比特都必须在一个普通的C++代码> catch <代码>站点中嵌入)您将得到3个例外信息字。第二是指向异常对象的指针。您不希望解释它,没有C++中的反射。由catch关键字发出的异常过滤器是至关重要的。@ HANS:如果假定抛出的东西总是从<代码> STD::(对于许多代码库来说都是如此),难道它不能被解释吗?一旦你有了一个
std::exception
,你就可以
dynamic\u cast
到特定的异常类型,如果需要的话…被转换到什么样的异常?这是关键。你可能会得到什么。@Hans:这是一个
void*
——难道不能将
静态的
转换到
std::exception*
int main()
{
    try {
        return cppexcept_main();
    }
    catch (const std::exception& e)
    {
        //use e.what()
    }
}

int cppexcept_main()
{
    __try {
        return application_main();
    }
    __except(GrabStackTrace(GetExceptionInformation()), EXCEPTION_CONTINUE_SEARCH) {
         /* never reached due to EXCEPTION_CONTINUE_SEARCH */
    }
}