第一个语法:
try块的作用域在成员初始化列表完成之后开始,因此,在成员初始化期间抛出的任何异常都不会被此try-catch块捕获。
第二种语法:
它确保了如果在“成员初始化”列表期间引发异常,那么您就可以捕获该异常。
第三种语法:
它确保从函数体内try块的开始括号之间抛出的任何异常都被适当地捕获,这意味着在参数传递过程中引起的任何异常(如果可能发生)都不会被捕获在try-catch块中。
因此,是的,它们提供的功能明显不同。
编辑:
在构造函数和析构函数中使用第二种语法(function-try-block)时要考虑的一些准则:
根据C ++标准,
如果catch块没有抛出(要么抛出原始异常,要么抛出新的东西),并且控制权到达构造函数或析构函数的catch块的末尾,那么原始异常将自动被抛出。
简单来说:
构造函数或析构函数的try-block的处理程序代码必须通过发出一些异常来结束。
准则1:
构造函数的try-try块处理程序只有一个目的-转换异常。 (并且可能做日志记录或其他一些副作用。)它们对于任何其他目的都没有用。
从析构函数中抛出异常是一个坏主意,请看这里了解原因。
准则2:
析构函数try-try块根本没有实际用途。 他们永远都不会检测到任何东西,即使由于邪恶的代码而要检测到的东西,该处理程序对于执行任何操作也不是很有用,因为它无法抑制异常。
准则3:
始终在构造函数或析构函数主体中的本地try-block处理程序中清理非托管资源的获取,而永远不要在构造函数或析构函数function-try-block处理程序中进行清理。
对于标准粉丝:
C ++标准的15.3条第15款:
如果return语句出现在构造函数的function-try-block的处理程序中,则程序格式错误。
C ++标准第15.3节第16段:
如果控制到达构造函数或析构函数的function-try-block的处理程序的末尾,则将处理的异常重新抛出。 否则,当控制权到达function-try-block(6.6.3)的处理程序的末尾时,函数将返回。 从function-try-block的末尾流出就等于没有值的返回。 这会导致返回值函数(6.6.3)出现不确定的行为。
参考文献:
看看这里必须阅读的资源以获得更多详细信息和说明。