C ++异常处理如何处理异常派生类?

时间:2012-10-11 13:12:57

标签: c++ exception-handling

如果我抓住BaseException,这还会捕获源自BaseException的异常吗?异常处理是否关心继承等,还是只匹配被捕获的完全异常类型?

class MyException {
...
};
class MySpecialException : public MyException {
...
};

void test()
{
 try {
 ...
 }
 catch (MyException &e) {
   //will this catch MySpecialException?
 }
}

5 个答案:

答案 0 :(得分:5)

C ++异常处理将匹配异常子类。但是,它执行从第一个catch()到最后一个的线性搜索,并且只匹配第一个。因此,如果您打算同时捕获Base和Derived,则需要首先捕获(MySpecialException&)。

答案 1 :(得分:5)

使用代码很容易解释:http://ideone.com/5HLtZ

#include <iostream>

class ExceptionBase {
};

class MyException : public ExceptionBase {
};

int main()
{
    try
    {
        throw MyException();
    }
    catch (MyException const& e) {
        std::cout<<"catch 1"<<std::endl;
    }
    catch (ExceptionBase const& e) {
        std::cout<<"should not catch 1"<<std::endl;
    }

    ////////
    try
    {
        throw MyException();
    }
    catch (ExceptionBase const& e) {
        std::cout<<"catch 2"<<std::endl;
    }
    catch (...) {
        std::cout<<"should not catch 2"<<std::endl;
    }

    return 0;
}

输出:
赶上1 赶上2

答案 2 :(得分:2)

是的,这很常见。例如,尽管抛出的异常很可能是std::exceptionstd::bad_alloc等派生异常,但抓住std::runtime_error很常见。

您实际上可以捕获基类型和派生类,它们将被依次捕获,但您必须首先捕获派生类型。

try
{
   // code which throws bad_alloc
}
catch ( const std::bad_alloc & e )
{
   // handle bad_alloc
}
catch ( const std::exception & e )
{
   // catch all types of std::exception, we won't go here 
   // for a bad_alloc because that's been handled.
}
catch ( ... )
{
   // catch unexpected exceptions
   throw;
}

答案 3 :(得分:0)

是的,它将捕获从基础派生的异常。

答案 4 :(得分:0)

包括

class ExceptionBase { };

class MyException:public ExceptionBase { };

int main() {     尝试     {         抛出MyException();     }     catch(MyException const&amp; e){         std :: cout&lt;&lt;“catch 1”&lt;

////////
try
{
    throw MyException();
}
catch (ExceptionBase const& e) {
    std::cout<<"catch 2"<<std::endl;
}
catch (...) {
    std::cout<<"should not catch 2"<<std::endl;
}

return 0;