C ++派生类异常未被基类捕获

时间:2012-02-13 17:50:06

标签: c++ exception gcc4

在我预计会被抓住的情况下,不会遇到例外情况。代码在1 cpp文件中有1个函数,由GCC 4.2编译成静态库,然后链接到Cocoa应用程序。有问题的代码是

class runtime_error : public exception{
// More code
};


int foo( void ){
    try {
        if( x == 0 ){
            throw std::runtime_error( "x is 0" );
        }
    }
    catch( std::exception & e ){
    // I expect the exception to be caught here
    }
    catch( ... ){
        // But the exception is caught here
    }
}   

我可以将代码修改为

int foo( void ){
    try {
        if( x == 0 ){
            throw std::runtime_error( "x is 0" );
        }
    }
    catch( std::runtime_error & e ){
    // exception is now caught here
    }
    catch( … ){
    }
}

代码的第二个版本仅解决了runtime_error异常的问题,而不解决可能从std :: exception派生的其他异常类。知道什么是错的吗? 请注意,代码的第一个版本适用于Visual Studio。

谢谢,

巴里

2 个答案:

答案 0 :(得分:1)

您的代码无法编写。当我如下更改它以添加所需的包含,变量等时,它会按预期打印“异常”(g ++ 4.2和4.5)。你能告诉我们导致你问题的完整真实代码吗?

#include <exception>
#include <stdexcept>
#include <iostream>

int x = 0;

int foo( void ){
    try {
        if( x == 0 ){
            throw std::runtime_error( "x is 0" );
        }
    }
    catch( std::exception & e ){
        // I expect the exception to be caught here
        std::cout << "exception" << std::endl;
    }
    catch( ... ){
        // But the exception is caught here
        std::cout << "..." << std::endl;
    }

    return 0;
}

int main()
{
    foo();

    return 0;
}

答案 1 :(得分:0)

您的班级runtime_error是在您的代码命名空间中定义的类。我不确定为什么要将std::用作范围解析运算符?

不应该将行throw std::runtime_error( "x is 0" );更改为throw runtime_error( "x is 0" );吗?