#include<iostream>
using namespace std;
class Base{};
class Derived : public Base{};
int main() {
Derived d;
try {
throw d;
}
catch(Base b) {
cout << "1";
}
catch(Derived d) {
cout << "2";
}
return 0;
}
为什么该程序显示输出1而不显示2?如果我抛出了Base
类对象,并且输出为2,则不会有任何问题,因为派生类是具有附加功能的基类。但这是另一回事吗?
答案 0 :(得分:3)
尝试..捕获块始终将基类作为优先级。
如果早期的catch块处理的基类具有在下面显示的catch块中处理的派生类,则这些派生类的catch块将永远不会命中-它是以此方式设计的。
我可以举一个std :: exception类的例子
假设您扩展了一个异常类:
save()
在上面的示例中,投掷将永远不会被第二个接球挡住-永远不会
class AlgoException : public std::exception {}
try
{
throw AlgoException ();
}
catch (std::exception) { std::cout << 1; }
catch (AlgoException ) { std::cout << 2; }
如果执行上述操作,则它将打印'2'-这是在try .. catch块中处理异常时的良好编程习惯的方法。我们应该将基类catch块保留在所有派生类catch块之下。
try
{
throw AlgoException ();
}
catch (AlgoException ) { std::cout << 2; }
catch (std::exception) { std::cout << 1; }
如果执行上述操作,则它将永远不会打印“ 3”,而只会打印“ 2”
基类catch块必须出现在其派生类的最下方 捕获块。