CppCoreGuidelines E.14 用用户定义的设计类型作为异常(不要用内置类型)
05 August 2023
“Use purpose-designed user-defined types as exceptions (not built-in types)”
理由
用户自定义的类型能够更好的传达关于出错的信息。错误信息可以通过类型进行编码,这个类型本身不会因为其他人的异常而崩溃。
例子
throw 7; // bad throw "something bad"; // bad throw std::exception{}; // bad - no info
继承 std::exception
可以灵活的捕获特定异常,或通过 std::exception
处理异常。
class MyException : public std::runtime_error { public: MyException(const string& msg) : std::runtime_error{msg} {} // ... }; // ... throw MyException{"something bad"}; // good
异常并不需要从 std::exception
继承。
class MyCustomError final {}; // not derived from std::exception // ... throw MyCustomError{}; // good - handlers must catch this type (or ...)
如果在异常检测点没有额外有用信息要添加的化,可以用 std::exception
派生的系统库类型处理通用的异常情况。
throw std::runtime_error("someting bad"); // good // ... throw std::invalid_argument("i is not even"); // good enum classes are also allowed: enum class alert {RED, YELLOW, GREEN}; throw alert::RED; // good
强化
通过内置类型和 std::exception
抛出捕获异常。