非构造函数上的Do function try块有任何缺点
Do function try blocks on non-contructor functions have any disadvantage?
函数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;
}
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何在不产生任何垃圾的情况下获得C中的像素
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- C++映射有2个键,这样任何1个键都可以用来获取值
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- RtlCaptureStackBackTrace未捕获任何帧
- 链表c++插入,所有情况都已检查,但没有任何工作
- 使用rdtsc进行基准测试的缺点是什么
- C++模板函数,用于比较任何无符号整数和有符号整数
- Arduino millis() - millis() 怎么能等于 0 以外的任何东西?
- 在循环体内宣布变量有任何缺点
- 在一个库的一个头中转发声明所有类是否有任何(除了明显的)缺点
- 如果我的项目现在完全在 c++98 上,迁移到 c++11 的任何缺点
- 将pthread_mutex_t和pthread_cond_t作为类成员静态变量的任何缺点
- 使用Qt视觉工作室插件的任何缺点
- 在GCC中使用-O3有任何缺点吗
- 缺点:如何在编译之前使用不产生任何输出文件的命令检查文件?
- 非构造函数上的Do function try块有任何缺点
- 用Visual Studio c++编译器编译C代码有任何(与性能相关的)缺点吗?