我有一个关于在C ++中捕获异常的问题。 请考虑以下示例,其中我们按价值捕捉:
Chart
让我们说struct baseException{};
struct derivedException : public baseException {};
void g(){
// Bad stuff
if(!stuff)
throw derivedException();
else
throw baseException();
}
void f(){
try{
g();
}
catch(derivedException e){
// Caught derived exc
}
catch(baseException){
// Caught base exc
}
}
被抛出。编译器不会看到baseException
是derivedException
的特化,因此选择更正确的catch子句(baseException
)?
我同意,如果抛出baseException
,并且catch子句顺序被颠倒,切片会发生,但我不确定在这种情况下会发生什么。为什么编译器不能将其视为专业化?
我确实认为这是错误的方式,你应该总是通过引用来保留多态属性,但我想知道为什么编译器无法识别专业化。
答案 0 :(得分:3)
catch子句的规则是第一次匹配是选择的匹配。与重载功能不同,没有" best"比赛。
因此,在示例代码中,如果stuff
为false,则将执行catch(derivedException)
的正文,因为抛出的异常具有类型derivedException
;如果stuff
为真,则catch(baseException)
的主体将被执行,因为第一个catch子句不匹配,但第二个子句确实...
如果catch子句被反转,那么无论stuff
的值如何,第一个catch子句(catch(baseException)
)的主体都将被执行,因为两个异常都可以被基类型捕获