版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
一般
try..catch
块语句都用在函数体内,但是也有例外的时候,对于作者这种懒人,写语句能省则省。看看我是怎么操作的吧。
1."随处安放"在函数体’外’
- 看到以下代码相信不少人会认为语法错误吧,写少了一对
{}
,实则下面这段函数是没问题的。
void func()
try {
printf("This is a function.");
}
catch (...) {
}
- 相当于
void func()
{
try {
printf("This is a function.");
}
catch (...) {
}
}
2.为什么会这样,是什么黑魔法导致这样?
先看看try块的语法:
- 函数try块是一种函数体的替代语法形式,也是函数定义的一部分。
一般以下形式表示:
catch
称为处理块序列(可以是多个)- 函数体中的任何语句中抛出的所有异常,将控制转移到处理块序列(
catch
)中。
try {
...
}
catch (...) {
...
}
解开魔法
- 根据try块语法,try函数块可以作为函数体的替代。
3.这个有什么用?
当然有用啦。存在即合理,这魔法当然需要做点什么啦?!
- 构造函数成员初始化器列表中捕获异常,主要是构造过程中抛出异常清理构造过程中已经申请的内存,如果不能清空已构造的内存则会导致内存泄漏。
class A
{
public:
A(int count) try : m_count(count) {
new B();
...
throw;
}
catch (...) {
// 清空构造函数所产生的内存, 如清空new B()申请的内存。
}
~A() try {
}
catch (...) {
}
private:
int m_count;
};
- 用在debug调试中,只要定义
DEBUG
宏即能使用try...catch
机制。
void func()
#ifdef DEBUG
try
#endif
{
... // 一些操作
}
#ifdef DEBUG
catch(...) {
}
#endif /* DEBUG */
- 文章首发于微信公众号:Qt君