zoukankan      html  css  js  c++  java
  • Item 38. 异常安全之公理(Exception Safety Axioms)

    Item 38. Exception Safety Axioms

    公理,公认之理,无需证明。
    要证明一个欧几里得几何的定理,要借助于一系列的公理。
    要判断代码是否是异常安全,也有一系列的公理可以借用。

    ------------------------------------------------------
    1、异常是同步的 Exceptions Are Synchronous
    异常是同步的,只能在函数调用时发生。
    预定义类型的算法、赋值,以及其他底层的操作不会引发异常。(它们可能引发信号或中断,但那不较异常)

    操作赋重载和模板使得判断异常变得复杂,因为经常难以确定一个操作是否会引发函数调用和潜在的异常。
    例如对于用户定义类型String:
    const char *a, *b;
    String c, d;
    //...
    a = b; // no function call, no exception
    c = d; // function call, maybe an exception

    对于模板,事情变得更不确定:
    template <typename T>
    void aTemplateContext() {
        T e, f;
        T *g, *h;
        //...
        e = f; // function call? exception?
        g = h; // no function call, no exception
        //...
    }
    所以模板里的所有函数都得假定是一个函数调用,包括infix operators,和隐式转化。


    2、析构是安全的 It's Safe to Destroy
    通常,析构函数、operator delete 和 operator delete[] 不抛出异常。
    所以如下的异常捕获没有必要:
    X::~X() {
        try {
            delete ptr1_;
            delete ptr2_;
        }
        catch( ... ) {}
    }

    只需如此:
    X::~X() {
        delete ptr1_;
        delete ptr2_;
    }


    3、交换不抛出异常 Swap Doesn't Throw

    在使用STL的sort, reverse, partition等有交换的操作时,不用担心会引发异常。

  • 相关阅读:
    1086. Tree Traversals Again (25)
    1094. The Largest Generation (25)
    1076. Forwards on Weibo (30)
    1083. List Grades (25)
    1082. Read Number in Chinese (25)
    【七夕特辑】程序员表白网页合集
    flex布局
    Nodejs进阶:基于express+multer的文件上传
    Git 和 SVN 之间的五个基本区别
    React通用后台管理系统
  • 原文地址:https://www.cnblogs.com/aiwz/p/6333207.html
Copyright © 2011-2022 走看看