非构造函数上的Do function try块有任何缺点

Do function try blocks on non-contructor functions have any disadvantage?

本文关键字:任何 缺点 try function 构造函数 Do      更新时间:2023-10-16

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

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

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

关于这一点存在一些(相当老的)问题,问为什么我们需要它用于常规函数,例如Function try块,而不用于构造函数。然而,我的问题是稍微在另一个方向:我可以在常规函数中使用它作为常规try块的替代品而不用担心吗?比方说,仅仅是为了美观?

我为c++库开发了一个C接口,需要用try块封装每个接口函数以捕获任何异常。因此,我希望避免在每个函数中使用额外的大括号块…

只有一件事引起了我的关注:在答案https://stackoverflow.com/a/11535436/6695750中,davka引用了2000年的一篇文章,声称不能从对应于函数-try-block的catch块返回值。我用gcc 5.4.0进行了测试,在那里我可以从捕获块返回一个值,没有问题。这是标准的,还是gcc的非标准扩展?

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

等价于

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

用于正则函数。

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

我可以在常规函数中使用它作为常规try块的替代品而不用担心吗?

在某些情况下你不能使用function-try-block:你不能访问catch子句中的任何局部变量。

void g() {
    int i = 2;
    try {
        throw 2.3;
    } catch (double d) {
        cout << i << endl;   // OK. you can access i
        cout << d << endl;
    }
}
void f() try {
    int i = 2;
    throw 2.3;
} catch (double d) {
    cout << i << endl;   // FAIL! i is out of scope, you CANNOT access it.
    cout << d << endl;
}