非构造函数上的函数 try 块有什么缺点吗?
Do function try blocks on non-contructor functions have any disadvantage?
函数try块是函数体的一种特殊形式,例如:
int f() try {
// function body
}
catch {
// one or more catch-clauses.
}
主要目的是在构造函数中使用,以便记录任何基类 class 的构造函数抛出的异常。但是,也允许在常规函数中使用它们。
关于这个存在一些(很老的)问题,询问为什么我们需要它用于常规功能,例如Function try blocks, but not in constructors。但是,我的问题更偏向于另一个方向:我可以在常规函数中使用它作为常规 try-block 的替代而不用担心吗?比方说,只是为了美观?
我为 C++ 库开发了一个 C 接口,需要用一个 try 块封装每个接口函数以捕获任何异常。因此,我想避免在每个函数中使用额外的大括号块...
只有一件事引起了我的关注:在回答 中,davka 引用了 2000 年的一篇文章,声称您不能 return 来自对应于一个函数尝试块。我用 gcc 5.4.0 进行了测试,我可以 return 从 catch 块中毫无问题地获取一个值。这是标准,还是 gcc 的非标准扩展?
int f() try {
// function body
}
catch (/*..*/){
// one or more catch-clauses.
}
等同于
int f() {
try {
// function body
}
catch (/*..*/){
// one or more catch-clauses.
}
}
对于常规函数。
只有 constructor/destructor 有特殊处理,因为 catch 块抛出异常(隐式或显式)。
另见 the docu here。
Can I use it in regular functions as replacement for a regular try-block without concerns?
在某些情况下您不能使用 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;
}
函数try块是函数体的一种特殊形式,例如:
int f() try {
// function body
}
catch {
// one or more catch-clauses.
}
主要目的是在构造函数中使用,以便记录任何基类 class 的构造函数抛出的异常。但是,也允许在常规函数中使用它们。
关于这个存在一些(很老的)问题,询问为什么我们需要它用于常规功能,例如Function try blocks, but not in constructors。但是,我的问题更偏向于另一个方向:我可以在常规函数中使用它作为常规 try-block 的替代而不用担心吗?比方说,只是为了美观?
我为 C++ 库开发了一个 C 接口,需要用一个 try 块封装每个接口函数以捕获任何异常。因此,我想避免在每个函数中使用额外的大括号块...
只有一件事引起了我的关注:在回答 中,davka 引用了 2000 年的一篇文章,声称您不能 return 来自对应于一个函数尝试块。我用 gcc 5.4.0 进行了测试,我可以 return 从 catch 块中毫无问题地获取一个值。这是标准,还是 gcc 的非标准扩展?
int f() try {
// function body
}
catch (/*..*/){
// one or more catch-clauses.
}
等同于
int f() {
try {
// function body
}
catch (/*..*/){
// one or more catch-clauses.
}
}
对于常规函数。
只有 constructor/destructor 有特殊处理,因为 catch 块抛出异常(隐式或显式)。
另见 the docu here。
Can I use it in regular functions as replacement for a regular try-block without concerns?
在某些情况下您不能使用 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;
}