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

8

如果我捕获了 BaseException ,这是否也会捕获从 BaseException 派生的异常? 异常处理是否关心继承等,还是仅匹配要捕获的 确切 异常类型?

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

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

2
你写过任何代码来试试吗? - Skizz
不行,我的所有工作都在一个集成开发环境中,因此创建一个10行的测试程序需要大量的折腾。哦,要是有一个在线GCC编译器就好了 :) - Mr. Boy
1
Skizz,试试 ideone.com :) - Dmitry Ledentsov
1
@DmitryLedentsov 非常棒! - Mr. Boy
我的感觉是这个https://dev59.com/cmw15IYBdhLWcg3wMpEY 是你要找的,使用引用来防止切片(第一个回答有10个赞应该是)-编辑:由于你已经使用了引用,所以你是安全的。 - Najzero
5个回答

8

通过代码可以很容易地解释: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


6

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


3

是的,这很常见。例如,尽管抛出的异常可能是派生异常(如std::bad_allocstd::runtime_error),但通常会捕获std::exception

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

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;
}

1

包含

类 ExceptionBase { };

类 MyException : public ExceptionBase { };

int main() { try { 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;


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接