如果我传递派生类的对象,则应调用派生类catch块。但输出表明异常是由基类捕获的。为什么?
Intent
答案 0 :(得分:10)
标准说明(工作草案的[except.handle]/4]为例,强调我的):
尝试块的处理程序按外观顺序进行尝试。 [注意:这使得编写永远不能执行的处理程序成为可能,例如通过在相应的明确公共基类的处理程序之后为最终派生类放置处理程序
这正是您在代码中所做的 因此,无论你的期望是什么,我都会说这是预期的行为。
请注意,您可以交换两个处理程序来解决问题。
答案 1 :(得分:3)
关于这一点还有一点可说。
首先,优良作法是通过引用而不是值来捕获异常。这可以防止在派生它的情况下切片异常对象。这不是特定于异常,而是继承的一般特征。
讨论了这种现象的描述here
另外,正如另一个答案所指出的,如果你坚持以这种方式做事,你需要改变捕获的顺序,因为派生类满足基本的catch块。有另一种方法可以做到这一点虽然明确地使用了这个属性:只需让基类捕获所有内容。除非需要单独处理派生异常的特定功能,否则可以使用此
答案 2 :(得分:1)
按顺序检查catch子句 - 你得到第一个匹配,而不是最佳匹配。
因此,首先检查派生类型会抓住它。