05 August 2023

C++ 核心指南目录

“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 抛出捕获异常。