首页 > 后端开发 > C++ > 正文

如何自定义C++异常类 继承std exception实现用户异常

P粉602998670
发布: 2025-07-04 09:36:02
原创
808人浏览过

自定义异常类能提高异常信息的语义性和可识别性,便于区分不同模块或业务逻辑的异常情况。1. 继承 std::exception 或其派生类,并重写 what() 方法;2. 构造函数中接收并保存错误信息,what() 必须为 const noexcept 且返回成员变量;3. 可扩展错误码等附加信息,通过新增成员函数获取;4. 实际使用时应避免在 what() 中返回局部变量指针,避免复杂资源管理,建议设计异常类层级结构以便按需捕获。

如何自定义C++异常类 继承std exception实现用户异常

在 C++ 中,自定义异常类是一种常见的做法,特别是在大型项目中,能帮助我们更清晰地定位错误来源。标准库中的 std::exception 是所有标准异常的基类,通过继承它,我们可以创建自己的异常类。

如何自定义C++异常类 继承std exception实现用户异常

为什么需要自定义异常类?

C++ 标准库已经提供了一些异常类,比如 std::runtime_error、std::logic_error 等,但它们通常只能表达通用的错误类型。当我们开发复杂系统时,往往需要区分不同模块或业务逻辑的异常情况。

如何自定义C++异常类 继承std exception实现用户异常

举个例子:一个网络请求模块抛出的异常和一个文件读写模块的异常,虽然都属于运行时错误,但它们代表的含义完全不同。如果我们用同一个类型的异常来表示,后续捕获处理时就很难判断具体问题。

立即学习C++免费学习笔记(深入)”;

所以,自定义异常类的核心目的就是提高异常信息的语义性和可识别性

如何自定义C++异常类 继承std exception实现用户异常

如何继承 std::exception 实现自定义异常

要创建一个自定义异常类,最直接的方法是继承 std::exception 或其派生类(如 std::runtime_error),并重写虚函数 what()。

#include <exception>
#include <string>
#include <iostream>

class MyException : public std::exception {
private:
    std::string msg;
public:
    explicit MyException(const std::string& message) : msg(message) {}

    const char* what() const noexcept override {
        return msg.c_str();
    }
};
登录后复制

使用方式如下:

try {
    throw MyException("这是一个自定义异常");
} catch (const std::exception& e) {
    std::cout << "捕获到异常: " << e.what() << std::endl;
}
登录后复制

需要注意几点:

  • 构造函数接受错误信息,并保存为成员变量。
  • what() 函数必须是 const noexcept 的。
  • 返回的字符串不能是局部变量,否则会引发未定义行为。

自定义带错误码的异常类

有时候除了描述性的信息,我们还需要附加一些结构化的数据,比如错误码。这时候可以在异常类中加入额外字段。

class MyErrorCodeException : public std::exception {
private:
    std::string msg;
    int errorCode;
public:
    MyErrorCodeException(const std::string& message, int code)
        : msg(message), errorCode(code) {}

    const char* what() const noexcept override {
        return msg.c_str();
    }

    int code() const noexcept {
        return errorCode;
    }
};
登录后复制

使用示例:

try {
    throw MyErrorCodeException("数据库连接失败", 1001);
} catch (const MyErrorCodeException& e) {
    std::cout << "错误码:" << e.code() << ", 描述:" << e.what() << std::endl;
}
登录后复制

这种方式适合需要根据错误码做进一步处理的情况,比如日志记录、界面提示等。


常见注意事项与建议

在实际开发中,使用自定义异常时要注意以下几点:

  • 不要在 what() 中返回临时字符串指针,比如 "Error" 或者函数内的局部数组。
  • 尽量避免在异常对象中包含复杂资源管理逻辑,比如打开文件、分配内存等,以免在抛出异常时造成二次异常。
  • 如果你有多个模块都需要自定义异常,可以考虑设计一个异常类的层级结构,例如:
    • BaseException
      • NetworkException
      • FileException
      • DatabaseException
  • 这样在 catch 时就可以按需捕获特定子类。

基本上就这些。继承 std::exception 来实现用户异常并不复杂,但细节上容易忽略,尤其是在字符串生命周期和异常安全方面。只要按照规范编写,就能写出清晰可靠的异常类。

以上就是如何自定义C++异常类 继承std exception实现用户异常的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号