zoukankan      html  css  js  c++  java
  • C++标准库第二版笔记 3 和异常的理解 1

    C++标准库第二版笔记 3 和异常的理解 1


    差错和异常(error and exception)的处理

    标准异常类(exception class)

    定义于

    分为: 1、语言本身支持的异常 2、标准库发出的异常 3、程序作用域(scope of a program)之外发出的异常

    程序作用域内的错误通常可以被避免(代码的逻辑错误,俗称bug)。程序外的错误,例如资源不足等列为第三种。

    栈解旋(stack unwinding)

    异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上的构造的所有对象,都会被自动析构。析构的顺序与构造的顺序相反。这一过程称为栈的解旋(unwinding)。

    自注:这也是effective c++中提到的,延后局部变量声明的原因。

    异常接口声明(exception interface)

    1)为了加强程序的可读性,可以在函数声明中列出可能抛出的所有异常类型,例如:

    void func() throw (A, B, C , D); //这个函数func()

    能够且只能抛出类型A B C D及其子类型的异常。 2)如果在函数声明中没有包含异常接口声明,则次函数可以抛掷任何类型的异常,例如:

    void func();

    3)一个不抛掷任何类型异常的函数可以声明为:

    void func() throw();

    4) 如果一个函数抛出了它的异常接口声明所不允许抛出的异常,unexpected函数会被调用,该函数默认行为调用terminate函数中止程序。

    自注:由此引发了之前所没有解决的关键字noexcept的讨论。

    引用自csdn文章

    关键字 noexcept

    void foo() noexcept; // 表面函数foo不准备也不打算抛出异常

    字面意思

    不打算抛出异常有两层意思。

    1、该函数中任意原子操作都绝不抛出异常。
    2、所有的异常都会在该函数中得到捕获并妥善解决。

    如果在noexcept关键字下的函数中有异常或还尚未处理,程序将调用std terminate并且将默认调用std abort。

    原因

    他瞄准了空异常明细(empty exception specification)的各种问题。

    有三,运行时检验(会直接abort)、开销和无法用于泛型码中

    (runtime checking)
    (runtime overhead)
    (unusable in generic code)

    指定何时不抛出异常

    void swap(type& x, type& y) noexcept(noexcept(x.swap(y))) {
        x.swap(y);
    }

    因此noexcept等价于noexcept(true)

    设计珠玑

    1、析构函数应当提供一个隐式供应的(nonthrowing)异常明细。 2、可被标注来说明与c兼容。 3、不适用于带有危险的(若违反会导致不明确行为)的函数。

  • 相关阅读:
    SystemTap
    在qemu上运行BusyBox
    Initramfs 原理和实践
    在qemu环境中用gdb调试Linux内核
    [转载] 你所不知道的TIME_WAIT和CLOSE_WAIT
    Linux VXLAN
    :not伪类选择器一些错误的写法
    c# 微软小冰-虚拟女友聊天
    Django使用表单操作数据库
    Django内置过滤器详解附代码附效果图--附全部内置过滤器帮助文档
  • 原文地址:https://www.cnblogs.com/PROJECT-IDOLPROGRAM/p/9256324.html
Copyright © 2011-2022 走看看