7

如果我正在捕捉BaseException,这也会捕捉到源自 的异常BaseException吗?异常处理是否关心继承等,还是只匹配被捕获的确切异常类型?

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

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

5 回答 5

7

用代码很容易解释: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

于 2012-10-11T13:24:29.693 回答
6

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

于 2012-10-11T13:16:13.903 回答
3

是的,它会的,这很常见。std::exception例如,尽管抛出的异常很可能是派生的异常,例如std::bad_allocor ,但仍然捕获它是很常见的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;
}
于 2012-10-11T13:16:34.997 回答
1

包括

类 ExceptionBase { };

类 MyException : 公共 ExceptionBase { };

int main() { 尝试 { throw MyException(); } catch (MyException const& e) { std::cout<<"catch 1"<

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

return 0;
于 2013-04-24T08:40:12.763 回答
1

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

于 2012-10-11T13:14:29.840 回答