在我预计会被抓住的情况下,不会遇到例外情况。代码在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。
谢谢,
巴里
答案 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" );
吗?