函数try块对非构造函数有什么不利吗?

时间:2016-08-24 07:51:13

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

相当于

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

用于常规功能。

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

另见the docu here

答案 1 :(得分: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;
}