语法
函数try块是一种函数体的替代语法形式,是函数定义的一部分
try构造函数初始化器 复合语句 处理块序列
(1)构造函数初始化器 - 成员初始化器列表,只在构造函数允许
(2)复合语句 - 花括号环绕的语句序列,它组成函数体
(3)处理块列表 - 一个或多个catch子句的序列
解释
函数try块将一系列catch子句与整个函数体,以及成员初始化器列表(若用于构造函数)关联起来。从函数体中的任何语句,或(对于构造函数)从任何成员或基类的构造函数,或(对于析构函数)从任何成员或基类的析构函数中抛出的搜友异常,以与常规try块中抛出的异常时相同方式,将控制转移到处理块序列中。
在进入任何构造函数上的函数try块的catch子句前,所有完整构造函数的成员和基类都会被销毁。
若函数try块在委托构造函数上,而它调用的非委托构造函数成功完成,但之后该委托构造函数的函数体抛出了异常,则将在进入函数try块的任何catch子句之前完成此对象的析构函数。
在进入析构函数上的函数try块的任何catch子句之前,所有的基类和变体成员均已被销毁。
若由于构造函数或析构函数上的函数try块的catch子句访问基类或对象的非静态成员,则其行为未定义。
构造函数的函数try块中的每个catch子句都必须以抛异常终止。若控制抵达这种异常处理的尾部,则当前异常被如同用throw;来自动重抛。不允许在构造函数的函数try块的任何catch子句中使用return语句。
抵达析构函数的函数try块的catch子句末尾,也如同用throw;来自动重抛当前异常,但允许使用return语句。
对于所有其他函数,若函数返回类型为(可有cv限定的)void,则抵达catch子句末尾等价于return;否则行为未定义。
注解
函数try块的主要目的是应对从构造函数中的成员初始化器列表抛出的异常,进行记录并重抛,修改异常对象并重抛,抛出一个不同的异常,或终止程序。它们很少为析构函数或常规函数所用。
函数try块不捕捉从按值传递的函数形参的复制/移动构造函数和析构函数中抛出的异常:这些异常是在调用方的语境抛出的。
线程的顶层函数的函数try块不捕捉从线程局部对象的构造函数和析构函数(但除了函数作用域的线程局域对象的构造函数)中抛出的异常。
类似的,main()函数的函数try块不捕捉从静态对象的构造函数和析构函数(但除了函数局域静态对象的构造函数)中抛出的异常。函数形参(但并非声明于函数自身中的任何对象)的作用域和生存期延续到处理块序列的结尾。