参考资料: http://c.biancheng.net/view/422.html

1, 基本语法
try {
    语句组
}
catch (异常类型) {
    异常处理代码
}
catch (异常类型) {
    异常处理代码
}

catch 可以有多个,但至少要有一个

try...catch 语句的执行过程是:
  • 执行 try 块中的语句,如果执行的过程中没有异常拋出,那么执行完后就执行最后一个 catch 块后面的语句,所有 catch 块中的语句都不会被执行;
  • 如果 try 块执行的过程中拋出了异常,那么拋出异常后立即跳转到第一个“异常类型”和拋出的异常类型匹配的 catch 块中执行(称作异常被该 catch 块“捕获”),执行完后再跳转到最后一个 catch 块后面继续执行
  • 异常没有被 catch 块捕获,异常也就得不到处理,那么程序就会立即中止,try...catch 后面的内容都不会被执行。
2,捕获所有异常写法
   ...
  try {
            duration_pow_num = std::stod(*duration_pow_num_opt);
        } catch (...) {
            duration_pow_num = 0.6;
            VLOG_APP(INFO) << "duration_pow_num change err ";
        }

3,捕获异常处理
函数 A 在执行过程中发现异常时可以不加处理,而只是“拋出一个异常”给 A 的调用者,假定为函数 B。

拋出异常而不加处理会导致函数 A 立即中止,在这种情况下,函数 B 可以选择捕获 A 拋出的异常进行处理,也可以选择置之不理。如果置之不理,这个异常就会被拋给 B 的调用者,以此类推。

如果一层层的函数都不处理异常,异常最终会被拋给最外层的 main 函数。main 函数应该处理异常。如果main函数也不处理异常,那么程序就会立即异常地中止。