前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C/C++黑魔法-随处安放的try

C/C++黑魔法-随处安放的try

作者头像
Qt君
发布2019-07-15 16:41:30
2890
发布2019-07-15 16:41:30
举报
文章被收录于专栏:跟Qt君学编程

一般try..catch块语句都用在函数体内,但是也有例外的时候,对于作者这种懒人,写语句能省则省。看看我是怎么操作的吧。

1."随处安放"在函数体’外’

  • 看到以下代码相信不少人会认为语法错误吧,写少了一对{},实则下面这段函数是没问题的。
代码语言:javascript
复制
void func()
try {
    printf("This is a function.");
}
catch (...) {

}
  • 相当于
代码语言:javascript
复制
void func() 
{
    try {
        printf("This is a function.");
    }
    catch (...) {

    }
}

2.为什么会这样,是什么黑魔法导致这样?

先看看try块的语法:

  • 函数try块是一种函数体的替代语法形式,也是函数定义的一部分。

一般以下形式表示:

  • catch称为处理块序列(可以是多个)
  • 函数体中的任何语句中抛出的所有异常,将控制转移到处理块序列(catch)中。
代码语言:javascript
复制
try {
	...
}
catch (...) {
	...
}

解开魔法

  • 根据try块语法,try函数块可以作为函数体的替代。

3.这个有什么用?

  当然有用啦。存在即合理,这魔法当然需要做点什么啦?!

  1. 构造函数成员初始化器列表中捕获异常,主要是构造过程中抛出异常清理构造过程中已经申请的内存,如果不能清空已构造的内存则会导致内存泄漏。
代码语言:javascript
复制
class A
{
public:
    A(int count) try : m_count(count) {
     	new B();
     	...
     	throw;
    }
    catch (...) {
    	// 清空构造函数所产生的内存, 如清空new B()申请的内存。
    }

    ~A() try {
    }
    catch (...) {
    }

private:
    int m_count;
};
  1. 用在debug调试中,只要定义DEBUG宏即能使用try...catch机制。
代码语言:javascript
复制
void func()
#ifdef DEBUG
try
#endif
{
	... // 一些操作
}
#ifdef DEBUG
catch(...) {
}
#endif  /* DEBUG */
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1."随处安放"在函数体’外’
  • 2.为什么会这样,是什么黑魔法导致这样?
  • 3.这个有什么用?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档