c++ - 非构造函数上的函数 try block 有什么缺点吗?

标签 c++ c++11 exception function-try-block

函数try block 是函数体的一种特殊形式,例如:

int f() try {
  // function body
} 
catch {
  // one or more catch-clauses.
}

主要目的是在构造函数中使用,以便记录任何基类的构造函数抛出的异常。但是,也允许在常规函数中使用它们。

对此存在一些(相当古老的)问题,询问为什么我们需要它来实现常规功能,例如Function try blocks, but not in constructors 。然而,我的问题更多的是在另一个方向:我可以在常规函数中使用它来代替常规 try block 而不用担心吗?比如说,只是出于美观原因?

我为 C++ 库开发了一个 C 接口(interface),需要使用 try block 封装每个接口(interface)函数以捕获任何异常。因此,我想避免在每个函数中使用额外的花括号 block ......

只有一件事引起了我的担忧:在答案中https://stackoverflow.com/a/11535436/6695750 ,davka 引用了 2000 年的一篇文章,声称无法从与函数 try block 对应的 catch block 中返回值。我用 gcc 5.4.0 进行了测试,在那里我可以毫无问题地从 catch block 返回一个值。这是标准,还是 gcc 的非标准扩展?

最佳答案

int f() try {
  // function body
} 
catch (/*..*/){
  // one or more catch-clauses.
}

相当于

int f() {
    try {
      // function body
    } 
    catch (/*..*/){
      // one or more catch-clauses.
    }
}

用于常规函数。

只有构造函数/析构函数有特殊处理,因为 catch block 会抛出异常(隐式或显式)。

另请参阅the docu here .

关于c++ - 非构造函数上的函数 try block 有什么缺点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39117422/

相关文章:

java - 正在测试的方法调用 private void 方法,我也想将其包含在我的测试中

c++ - 数组的值随机变化

c++ - Qt 在背景项上传播绘制事件

c++ - 使用 C++11 原子编写(旋转)线程屏障

c++ - 使用 libc++ 导致 GDB 在 OS X 上出现段错误

c++ - 我可以重载采用指针和非构造模板对象的运算符吗?

C++单例模板类

c++ - 从 QSettings 读取自定义元类型数组

c# - C# switch出现异常后如何继续

.net - Outlook 2003 加载项 - 创建 WPF 窗口后应用程序关闭时出现 COM 异常