异常类的构造函数和异常信息相关的函数不应抛出异常
7.13 ID_exceptionInException
创建、复制异常对象以及获取异常信息时不应再抛出异常,否则不利于异常的定位与处理。
示例:
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 等其他标准异常类作为基类。
相关
依据
ISO/IEC 14882:2003 18.6.1
ISO/IEC 14882:2011 18.8.1
参考
MISRA C++ 2008 15-1-1