如果我抓住BaseException
,这还会捕获源自BaseException
的异常吗?异常处理是否关心继承等,还是只匹配被捕获的完全异常类型?
class MyException {
...
};
class MySpecialException : public MyException {
...
};
void test()
{
try {
...
}
catch (MyException &e) {
//will this catch MySpecialException?
}
}
答案 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::exception
或std::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;