C++ 函数的异常处理机制:如何自定义异常类?

C++ 函数的异常处理机制:如何自定义异常类?
最新回答
死在新鲜感

2021-06-09 04:59:24

在 C++ 中,自定义异常类允许开发者针对特定错误场景定义专属的异常类型,从而提升代码的可读性和错误处理的精确性。以下是实现自定义异常类的核心步骤和示例:

1. 创建自定义异常类
  • 继承自 std::exception:通过继承标准库中的 std::exception,可以复用其接口(如 what() 方法),同时扩展自定义字段(如错误码、上下文信息)。
  • 重写 what() 方法:返回描述错误的字符串,通常通过构造函数传入错误信息。
#include <exception>#include <string>class MyException : public std::exception {private: std::string message;public: explicit MyException(const std::string& msg) : message(msg) {} const char* what() const noexcept override { return message.c_str(); }};2. 抛出自定义异常
  • 使用 throw 关键字抛出异常对象,通常在检测到错误条件时触发(如参数无效、资源分配失败等)。
void validateInput(int value) { if (value < 0) { throw MyException("输入值不能为负数"); }}3. 捕获并处理自定义异常
  • 通过 try-catch 块捕获特定异常类型,执行对应的错误处理逻辑(如日志记录、资源释放或用户提示)。
#include <iostream>int main() { try { validateInput(-5); // 触发异常 } catch (const MyException& e) { std::cerr << "捕获到自定义异常: " << e.what() << std::endl; } catch (...) { std::cerr << "捕获到未知异常" << std::endl; } return 0;}

输出

捕获到自定义异常: 输入值不能为负数4. 高级用法:扩展自定义异常类
  • 添加额外字段:如错误码、时间戳等,辅助调试。
  • 多级异常继承:定义更细粒度的异常类型(如 NetworkException、FileException)。
class NetworkException : public MyException {private: int errorCode;public: NetworkException(const std::string& msg, int code) : MyException(msg), errorCode(code) {} int getErrorCode() const { return errorCode; }};// 使用示例try { throw NetworkException("连接超时", 408);} catch (const NetworkException& e) { std::cerr << "网络错误 [" << e.getErrorCode() << "]: " << e.what() << std::endl;}关键注意事项
  1. 异常安全

    确保抛出异常时资源不泄漏(如使用 RAII 管理内存、文件句柄等)。

  2. 性能考量

    异常处理比正常流程慢,避免在性能敏感代码中滥用。

  3. 标准异常的替代方案

    若无需额外信息,可直接使用 std::runtime_error 或 std::invalid_argument 等标准异常。

通过自定义异常类,开发者能够更精准地表达错误语义,使代码逻辑更清晰,同时便于维护和扩展。