c++有一些在现实世界中很少看到的结构。这些结构有着自己的用法,但是要特别小心保守的予以运用。就像是网站 The Old New Thing首页标题上面的说的那样:

“代码通常被读的次数原因超过了被写的次数,所以计划要遵循此道。”

在下面将介绍一些很少有人能够知道的c++构造函数,包括其中的运用场景,语法和陷阱。

运用场景

try函数块的应用场景一般局限于下面几个:

(1)构造函数初始化列表;

(2)基类构造含数据;

(3)析构函数;

语法

对于函数

void f() try { /*...*/ } catch (...) { /*...*/ }

  这等价于

void f() { try { /*...*/ } catch (...) { /*...*/ } }

  对于构造函数初始化列表

struct A : public B
{
A() try : B(), foo(1), bar(2)
{
// constructor body
}
catch (...)
{
// exceptions from the initializer list are caught here
// but also rethrown after this block (unless the program is aborted)
} private:
Foo foo;
Bar bar;
};

  对于析构函数来说,跟正常函数的使用方法是类似的

struct A
{
~A()
try
{
// destructor body
}
catch (...)
{
// exceptions from the destructor are caught here
// but also rethrown after this block (unless the program is aborted)
}
};

  陷阱

  • 任何在构造函数和析构函数中捕捉的异常,默认情况下都会被重新抛出。这样的话,大多是情况下当捕捉到一个异常的时候,你能够做的事情就是用日志记录,或者是做一些清理工作。不管一个对象因为什么原因而失败了,你都不应该尝试去保存它的实例。
  • 在函数catch块中的return语句表现的跟函数中的返回语句一样;
  • 但控制流走到catch模块最后的时候,函数将返回。如果没有任何返回语句而且函数返回类型是非void的,那么行为将会是不确定的。
  • try块函数主要有一些非直观的行为:
    • 从命名空间范围内定义的构造函数中抛出的异常无法捕捉。
    • 从static变量中获取的析构函数的对象中抛出的异常无法捕捉。

如上,try模块函数在进行代码审查的时候至少是应该引起重视的。try块函数使用并非都是错的,在一些上没有提到的用户场景中用到的时候,很容易出现问题。

来源http://szelei.me/rarely-known-cpp-constructs-part-1-function-try-blocks/

很少有人知道的c++中的try块函数的更多相关文章

  1. 几个超级好用但很少有人知道的 webstorm技巧

    我总结一些我发现的比较实用的功能,内容来自日常工作中用到的功能.图片来自PPT,是在公司内部的分享. 你不知道的webstorm进阶使用技巧 1.双击shift 全局搜索,可以搜索代码.设置等. 如果 ...

  2. 很少人知道的office专用卸载工具

    Microsoft Office是微软公司开发的一套基于 Windows 操作系统的办公软件套装.常用组件有 Word.Excel.Powerpoint等.当我们不需要再用了或者想安装旧版本的话,首先 ...

  3. 几个超级实用但很少人知道的 VS 技巧

    大家好,今天分享几个我知道的实用 VS 技巧,而这些技巧我发现很多人都不知道.因为我经常在工作中遇到:我在同事电脑上解决问题,或在会议上演示代码示例时,使用了一些 VS "骚"操作 ...

  4. 几个超级实用但很少人知道的 VS 技巧[更新]

    大家好,今天分享一些实用的 VS 技巧,而这些技巧我发现很多人都不知道.因为我经常在工作中遇到:我在同事电脑上解决问题,或在会议上演示代码示例时,使用了一些 VS "骚"操作,他们 ...

  5. 12个很少被人知道的CSS事实

    之前没有认真的研究过,padding-bottom的值如果是百分比,那么它的实际值是根据父类的宽度来调整的.我还以为是根据这个元素的本身的宽度来定义呢?汗..padding-top/padding-l ...

  6. 很少有人会告诉你的Android开发基本常识

    原文:很少有人会告诉你的Android开发基本常识. 文章介绍了一些关于开发.测试.版本管理.工具使用等方面的知识.

  7. 记录下一个C++初始化的方式(很少有人这么用,但是却是一个使代码更加简洁的方式)

    很多时候,在一个类创建的时候给它初始化,一般呢,99%的人都会这么用: //A.h Class CA { int a; char* p; int getValue(); }; //A.cpp CA:: ...

  8. 为数不多的人知道的 Kotlin 技巧及解析

    文章中没有奇淫技巧,都是一些在实际开发中常用,但很容易被我们忽略的一些常见问题,源于平时的总结,这篇文章主要对这些常见问题进行分析. 这篇文章主要分析一些常见问题的解决方案,如果使用不当会对 性能 和 ...

  9. 你应该要知道的JS中的this

    前言 this 是 JavaScript 中不可不谈的一个知识点,它非常重要但又不容易理解.因为 JavaScript 中的 this 不同于其他语言.不同场景下的 this 指向不同(当函数被调用执 ...

随机推荐

  1. SUSE Linux实现局域网时间同步

    0.前言     需求是这么来的,搭建了Storm集群进行协同过滤算法的计算性能测试,要求精度在毫秒(ms)级别.局域网内40个虚拟机节点,用 date 命令,精度上和效率上都不可行.所以,就搭建了 ...

  2. Jsp(3):内置对象和四种域对象的理解

    由来:在jsp开发中,会频繁使用到一些对象 .例如HttpSession,ServletContext,ServletContext,HttpServletRequet.所以Sun公司设计Jsp时,在 ...

  3. 【转】YUV420P的格式以及转换为RGB565的代码(Android摄像头的输出一般为YUV420P)

    http://blog.csdn.net/daisyhd/article/details/38866809 static void cvt_420p_to_rgb565(int width, int  ...

  4. linux 进程综合指令

    1. 查询当前机器运行的进程总数: ps -ef | wc -l ps -ef | grep httpd | wc -l 2. ulimit命令 表 1. ulimit 参数说明 选项 [option ...

  5. JavaScript 应用开发 #2:视图与模板

    在用 Backbone 开发的 JavaScript 应用里面,除了模型与集合以外,另一个重要的部分就是视图,英文是 View .在视图里面,我们可以去监听在页面上发生的事件,还有与视图相关的模型和集 ...

  6. Android 开发实践 ViewGroup 实现左右滑出窗口(二)

    接上一篇 <Android 开发实践 ViewGroup 实现左右滑出窗口(一)http://www.cnblogs.com/inkheart0124/p/3532862.html> 源码 ...

  7. SQL给字段加上统一的某个字符

    表名:News  字段名:No_id Update News set No_id='字符'+No_id

  8. ASCII 对应表 CHR()

    chr(9) tab空格       chr(10) 换行      chr(13) 回车        chr(13)&chr(10) 回车换行       chr(32) 空格符      ...

  9. CEO、COO、CFO、CTO

    CEO.COO.CFO.CTO是什么意思? 网站里的各种职位: CEO(Chief executive officer)首席执行官 类似总经理.总裁,是企业的法人代表. COO(Chief opera ...

  10. HTML5 新功能

    HTML5 中的一些有趣的新特性: 用于绘画的 canvas 元素 用于媒介回放的 video 和 audio 元素 对本地离线存储的更好的支持 新的特殊内容元素,比如 article.footer. ...