具有两个相似catch部分的代码的异常处理行为

时间:2019-02-03 14:06:30

标签: c++

我有一个简短的代码,仅出于练习目的而创建,我想检查一下如果我有两个catch部分,一个是按引用捕获($('#startDate').datetimepicker({ format: 'dd MM yyyy' }); $('#endDate').datetimepicker({ format: 'dd MM yyyy', useCurrent: false //Important! See issue #1075 }); ),第二个是按值捕获,那将会发生什么(int&)。问题是,当我运行此代码时,即使我抛出了“常规”整数,似乎仍发生了按引用捕获。为什么会这样?

注意:在MSVS17上编译时,出现错误C2313:

  

'int':在第15行被引用('int&')捕获

但是当我使用在线编译器时,它就可以正常工作。

当我删除一个catch部分时,即使在MSVS17中它也可以正常工作,但是,为什么要调用具有引用而不是另一个引用的catch部分

int

1 个答案:

答案 0 :(得分:5)

TL; DR

catch匹配中没有优先级。 catch匹配或不匹配。引用是匹配的。

不太简短的答案

cppreference says

  

当复合语句中的任何语句抛出类型E的异常时,它都会按照catch子句的列出顺序与handler-seq中每个catch子句的形式参数T的类型进行匹配。

即选择第一个匹配项(没有概念“更好”或“更差”匹配; catch要么匹配,要么不匹配。)

进一步说:

  

如果满足以下任一条件,则为匹配项:

     
      
  • ...
  •   
  • T是对E的左值引用(可能是cv限定)
  •   
  • ...
  •   

因此,catch(int&)是一个匹配项; catch(int)甚至没有机会被考虑。

Martin Bonner的示例

马丁·邦纳(Martin Bonner)提供了一个很好的例子,可以让您理解这一点,而操作人员则可以完全理解:

try {
    throw 5;
}
catch (int) { // int first
    // ...
}
catch (int&) { // this is not even considered!
    // ...
}