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. noip 2015 提高组

    算是填个坑吧 , QwQ Day 1 第一题很水,就是考代码能力 ,直接贴代码. #include <iostream> #include <cstdlib> #include ...

  2. uva 11195 Another queen (用状态压缩解决N后问题)

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. android常见错误-Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE

    在andorid进行调试的过程中,出现下面的错误: 解决方法: 修改一下应用程序描述符: <manifest xmlns:android="http://schemas.android ...

  4. IT行业智力测试

    1.有10筐苹果,其中有1筐是次品,正品苹果每个10两,次品苹果每个9两,现有一称,问怎么一次称出次品是哪筐? 2.有甲.乙.丙.丁四个人,要在夜里过一座桥.他们通过这座桥分别需要耗时1.2.5.10 ...

  5. android开发之国际化

    国际化,听起来高大上,做起来很简单. 我们来实现一个简单的效果,让应用根据系统的语言来做不同的显示,假如android系统默认是英语,应用就以英文的形式显示,如果android系统默认是中文,则应用就 ...

  6. mac 神奇时光机

    http://bbs.zol.com.cn/nbbbs/d544_8216.html

  7. Linux系统ifconfig命令找不到,centos ifconfig Command not found

    centos ifconfig Command not found,Linux系统ifconfig命令找不到 >>>>>>>>>>>& ...

  8. Nunit概要

    一.NUnit是一个单元测试框架,专门针对于.NET来写的.其实在前面有JUnit(Java),CPPUnit(C++),他们都是xUnit的一员.最初,它是从JUnit而来.现在的版本是2.2.接下 ...

  9. Customize the SharePoint 2013 search experience with a Content Enrichment web service

    Did you ever wish you had more control over how your content is indexed and presented as search resu ...

  10. J2EE入门必备

    1,J2EE是什么 J2EE(Java 2 platform Enterprise Edition)是软件平台,适于创建服务器端的大型应用软件和服务系统. J2EE适合开发大规模的业务系统,这种级别的 ...