☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

异常类的拷贝构造函数不可抛出异常

7.12 ID_throwWhileThrowing
目录 › next › previous

异常类的拷贝构造函数抛出异常违反异常处理机制,会导致程序异常终止。

当抛出异常时,throw 表达式指定的异常对象会被复制,用以初始化相应 catch 子句的参数,如果在复制过程中又抛出异常便违反了异常处理机制,这种情况将直接引发 std::terminate 函数的执行,使程序异常终止。

示例:

class E {
public:
    E() {}
    E(const E&) {
        throw 0;    // Non-compliant
    }
};

int main() {
    try {
        E e0;
        throw e0;   // Throw while throwing, calls std::terminate()
    }
    catch (E& e1) {
        ....
    }
}

例中 catch 子句的参数 e1 引用由 e0 复制而成的临时对象,在复制过程中抛出的异常无法被捕获,会直接导致程序异常终止。

相关

ID_nonCopiableException ID_exceptionInException

依据

ISO/IEC 14882:2003 15.1(3) ISO/IEC 14882:2011 15.1(3 7) ISO/IEC 14882:2017 18.1(3 7)

参考

C++ Core Guidelines E.16 SEI CERT ERR60-CPP
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.