Исключение из производного класса C ++ не обнаружено базовым классом - PullRequest
0 голосов
/ 13 февраля 2012

Исключения не обнаруживаются в том случае, если я ожидаю, что они будут обнаружены.Код находится в функции 1 в 1 файле cpp, который скомпилирован в статическую библиотеку GCC 4.2, а затем связан с приложением Какао.Код, о котором идет речь:

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 ]

1 голос
/ 13 февраля 2012

Ваш код не компилируется как написано. Когда я изменяю его, как показано ниже, чтобы добавить необходимые включения, переменные и т. Д., Он печатает «исключение», как и ожидалось (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;
}
0 голосов
/ 14 февраля 2012

Ваш класс runtime_error - это класс, определенный в пространстве имен вашего кода.Я не уверен, зачем вам использовать его с std:: в качестве оператора разрешения области?

Не следует ли изменить строку throw std::runtime_error( "x is 0" ); на throw runtime_error( "x is 0" );?

...