自定义异常类:继承std::exception的正确姿势
如何正确自定义 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();
}
};
要点:
what()必须noexcept。- 存储可拷贝的状态(字符串或枚举),避免存储指针。
- 异常对象必须可拷贝(异常抛出时复制)。
catch顺序:派生类优先于基类。- 可将自定义异常继承自
std::runtime_error或std::logic_error以利用已有构造函数。
try {
throw MyException("custom error");
} catch (const MyException& e) {
// 先捕获派生类
} catch (const std::exception& e) {
// 再捕获基类
}
C++11 以后异常类型应保持可移动可拷贝。