微软Visual Studio 2005 C++;异常处理 我在MS VisualStudio 2005中构建了一个C++应用程序,它连接到第三方库。对于某个输入,应用程序在第三方库中崩溃(显然是realloc.c中的某个地方;因此一定是某种内存问题)。我在发布版中运行,因为输入是巨大的。所以我一直运行到崩溃,然后选择调试。当我单独调试有罪函数时,我希望使用一些异常处理来防止应用程序崩溃,而不是干净地退出。所以我用了这样的方法: try { //- call 3rd party application function that fails } catch(...) { //- handle exception or whatever Logger::Fatal("Fatal error: Exiting..."); return false; }

微软Visual Studio 2005 C++;异常处理 我在MS VisualStudio 2005中构建了一个C++应用程序,它连接到第三方库。对于某个输入,应用程序在第三方库中崩溃(显然是realloc.c中的某个地方;因此一定是某种内存问题)。我在发布版中运行,因为输入是巨大的。所以我一直运行到崩溃,然后选择调试。当我单独调试有罪函数时,我希望使用一些异常处理来防止应用程序崩溃,而不是干净地退出。所以我用了这样的方法: try { //- call 3rd party application function that fails } catch(...) { //- handle exception or whatever Logger::Fatal("Fatal error: Exiting..."); return false; },c++,visual-studio-2005,C++,Visual Studio 2005,但令我惊讶的是,应用程序仍然崩溃!我希望看到它显示错误消息,因为我可能捕获了所有带有省略号(…)的异常;我错过了什么?我甚至尝试在项目属性->C/C++->代码配置->启用异常处理中设置/EHca(was/EHsc)。关于可能导致问题的原因,请注意以下用法是否正确 my_class* mc[] = {nil, nil, nil}; for (int i = 0; i < 3; ++i) { mc[i] = new my_class(); //-Do stuff with m

但令我惊讶的是,应用程序仍然崩溃!我希望看到它显示错误消息,因为我可能捕获了所有带有省略号(…)的异常;我错过了什么?我甚至尝试在项目属性->C/C++->代码配置->启用异常处理中设置/EHca(was/EHsc)。关于可能导致问题的原因,请注意以下用法是否正确

my_class* mc[] = {nil, nil, nil};
for (int i = 0; i < 3; ++i) {
    mc[i] = new my_class();
    //-Do stuff with mc[i]
    if (mc[i] != nil) {
       delete mc[i];
       mc[i] = nil;
    }
}
my_class*mc[]={nil,nil,nil};
对于(int i=0;i<3;++i){
mc[i]=新的my_类();
//-与mc[i]合作
如果(mc[i]!=nil){
删除mc[i];
mc[i]=nil;
}
}
异常处理无法正常工作是相当令人费解的。我当然会欣赏C++大师们的想法和见解。顺便说一句,同样的问题也发生在Linux(RHEL5)上,但我目前正在尝试让异常处理在Windows上工作


注意:当我让它在崩溃后调试时。我确实收到“访问冲突..无法读取位置”消息。有了这个更新的信息,我希望C++中的某些东西仍然能在Windows和Linux上工作,这样的崩溃。< /P> < P>你有没有尝试通过调用来调用崩溃?< /P> < P>你有没有尝试通过调用来调用崩溃?< /P> < P>正如米格尔所建议的,正确的解决问题的方法可能是使用<代码> StunUnWord Excel(SuffunLeDeExpCouthStudio< <代码> >。不过我还是想详细解释一下你们的现象

首先,并非所有的程序“崩溃”都与异常有关。例如,CRT可能在出现错误时触发程序终止,例如
向量中的无效元素访问,或纯虚拟析构函数调用。如果您还想涵盖这些情况,请参见
set\u unexpected
set\u terminate

除此之外,
catch
块只能捕获从相应代码块抛出的异常。o可能有其他地方调用的函数,如窗口过程(如果适用)、其他线程等

现在,关于你的问题。让我们首先了解为什么像
catch(…)
这样的事情可能会捕获访问冲突等,以及为什么这种情况并不总是发生(比如在您的案例中)

Windows提供了自己的异常处理机制—SEH,结构化异常处理。它远远优于C++异常处理。此外,硬件中断(由CPU引起)会自动“转换”为SEH异常,因此使用SEH的代码可以处理软件异常和硬件故障

<>强>微软C++编译器实际上通过SEH 实现C++异常。代码< >代码> RAISeExpUT//CODE >通过指定C++特定的异常代码和参数,<代码> catch >代码>是除< /COD>之外的C++代码特定的包装器,对于每个具有析构函数的对象,编译器生成类似于代码>最后的< /COD>块的东西。反之亦然。当引发非C++异常时,执行C++异常所生成的相同代码。 此外,还有一些所谓的编译器异常处理选项,它们会影响编译器异常处理代码的生成及其在运行时的行为。它们被称为异常处理模型:

  • 同步。编译器生成的代码保证只有在显式引发异常时才能正常工作。这包括<代码>抛出>代码>语句,以及所有“外部”函数,这些代码的代码对编译器来说是不可见的(在某些变体中,只有C++的外部函数)。尤其是从内存中读取被认为是“安全的”
  • 异步。编译器不允许假设任何可能出现异常的地方。因此,即使访问内存地址时出现异常,它也会生成正确工作的代码
此外,在
catch(…)
中调用的CRT代码故意忽略非C++异常,除非选择异步EH模型

因此,如果希望
catch(…)
捕获非C++异常,则必须选择异步EH模型


一旦我写了一个,在我在驱动程序开发中遇到相关问题之后。它详细解释了这一切。

正如米格尔所建议的,解决问题的正确方法可能是使用
SetUnhandledExceptionFilter
。不过我还是想详细解释一下你们的现象

首先,并非所有的程序“崩溃”都与异常有关。例如,CRT可能在出现错误时触发程序终止,例如
向量中的无效元素访问,或纯虚拟析构函数调用。如果您还想涵盖这些情况,请参见
set\u unexpected
set\u terminate

除此之外,
catch
块只能捕获从相应代码块抛出的异常。o可能有其他地方调用的函数,如窗口过程(如果适用)、其他线程等

现在,关于你的问题。让我们首先了解为什么像
catch(…)
这样的事情可能会捕获访问冲突等,以及为什么这种情况并不总是发生(比如在您的案例中)

Windows提供了自己的异常处理机制—SEH,结构化异常处理。这比你想象的要好得多