2

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

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

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

在这方面存在一些(相当老的)问题,询问为什么我们需要它用于常规函数,例如Function try 块,而不是在构造函数中。但是,我的问题更多的是在另一个方向上:我可以在常规函数中使用它来替代常规的 try-block 而不用担心吗?比方说,只是出于审美原因?

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

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

4

2 回答 2

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

相当于

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

用于常规功能。

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

另请参阅此处的文档

于 2016-08-24T08:00:38.977 回答
2

我可以在常规函数中使用它来代替常规的 try-block 而不用担心吗?

在某些情况下,您不能使用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;
}
于 2016-08-24T08:40:54.743 回答