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

异常类的构造函数和异常信息相关的函数不应抛出异常

7.13 ID_exceptionInException
目录 › next › previous

创建、复制异常对象以及获取异常信息时不应再抛出异常,否则不利于异常的定位与处理。

示例:

class Exception {
    string msg;

public:
    Exception(const char* s) {
        if (!s) {
            throw AnotherException();  // Non-compliant
        }
        msg.assign(s);
    }

    const char* what() const {
        if (msg.empty()) {
            throw AnotherException();  // Non-compliant
        }
        return msg.c_str();
    }
};

例中在异常类的构造函数和 what 函数中抛出异常是不符合要求的,而且要注意 string 的构造及拷贝构造函数需要动态内存分配,当分配失败时也会抛出异常,有高可靠性要求的软件系统需要规避。

自定义的异常类可从标准异常类派生,成员也应尽量简单,如:

class Exception: public logic_error {
public:
    explicit Exception(const string& msg):
        logic_error(msg)
    {}
};

其中 logic_error 是标准异常类,在实际代码中也可以选择 runtime_error 等其他标准异常类作为基类。

相关

ID_throwWhileThrowing

依据

ISO/IEC 14882:2003 18.6.1 ISO/IEC 14882:2011 18.8.1

参考

MISRA C++ 2008 15-1-1
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.