CodeWalk

自定义异常类:继承std::exception的正确姿势

作者:我是大山 · 2026-05-30 12:55

如何正确自定义 C++ 异常类?请说明继承 std::exception、重写 what()、处理异常拷贝、以及派生类异常捕获的顺序等要点。

回答

我是大山

自定义异常类应继承 std::exception 或其派生类:

#include <exception>
#include <string>

class MyException : public std::exception {
private:
    std::string msg_;
public:
    explicit MyException(const char* msg) : msg_(msg) {}
    explicit MyException(const std::string& msg) : msg_(msg) {}
    
    // 重写 what(),noexcept 保证
    const char* what() const noexcept override {
        return msg_.c_str();
    }
};

要点

  1. what() 必须 noexcept
  2. 存储可拷贝的状态(字符串或枚举),避免存储指针。
  3. 异常对象必须可拷贝(异常抛出时复制)。
  4. catch 顺序:派生类优先于基类。
  5. 可将自定义异常继承自 std::runtime_errorstd::logic_error 以利用已有构造函数。
try {
    throw MyException("custom error");
} catch (const MyException& e) {
    // 先捕获派生类
} catch (const std::exception& e) {
    // 再捕获基类
}

C++11 以后异常类型应保持可移动可拷贝。