C++标准库异常类型有哪些 详解std exception及其派生类

std::exc++eption是c++标准异常类的基类,定义在头文件中,提供虚函数what()返回错误信息。常见派生类包括:1. std::bad_alloc(内存分配失败);2. std::bad_cast(类型转换失败);3. std::bad_typeid(typeid作用于null指针);4. std::logic_error(逻辑错误,如invalid_argument、length_error、domain_error);5. std::runtime_error(运行时错误,如range_error、overflow_error、underflow_error)。逻辑错误用于可通过代码审查发现的问题,运行时错误则因外部条件触发。使用时应根据错误类型选择具体派生类,并按引用捕获以避免拷贝和切片。

C++标准库异常类型有哪些 详解std exception及其派生类

C++标准库提供了一套异常类体系,主要以

std::exception

为基类。当你在写程序时遇到错误,比如内存分配失败、数组越界、类型转换出错等情况,标准库会抛出这些类型的异常。理解它们有助于你更好地处理错误。

C++标准库异常类型有哪些 详解std exception及其派生类

std::exception 是什么?

std::exception

是所有标准异常类的基类,定义在


头文件中。它提供了一个虚函数

what()

,用于返回错误信息的C风格字符串。虽然这个接口很简单,但它是整个C++标准异常体系的基础。

C++标准库异常类型有哪些 详解std exception及其派生类

你可以这样使用它:

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

try {    // 可能抛异常的代码} catch (const std::exception& e) {    std::cerr << "Exception caught: " << e.what() << std::endl;}

不过,通常你不直接抛

std::exception

对象,而是用它的派生类来表示具体的错误类型。

C++标准库异常类型有哪些 详解std exception及其派生类

常见的标准异常类有哪些?

C++标准库提供了多个从

std::exception

派生的异常类,每个都有特定用途。常见的一些包括:

std::bad_alloc

new操作符在内存分配失败时抛出。

std::bad_cast

:dynamic_cast失败时抛出(用于多态类型转换)。

std::bad_typeid

:typeid作用于NULL指针时抛出。

std::bad_exception

:当异常规范不匹配时可能抛出(现在较少使用)。

std::logic_error

:表示可以通过逻辑检查发现的错误。

std::runtime_error

:表示运行时才能检测到的错误。

这些类都定义在不同的头文件中,例如


包含大部分逻辑和运行时错误类。

logic_error 和 runtime_error 有什么区别

这两个类是最常用的异常基类,供用户自定义异常使用。

std::logic_error

代表程序逻辑错误,理论上可以在编译前通过代码审查发现。比如:

std::invalid_argument

:参数无效。

std::length_error

:试图创建超过最大长度的对象。

std::domain_error

:数学域错误(如负数开平方)。

举个例子,当你写一个函数,要求输入必须大于0,但传进来的是-1,这时候就可以抛

std::invalid_argument

std::runtime_error

这类错误往往无法在编译或设计阶段预测,只有在运行时才会暴露。例如:

std::range_error

:计算结果超出了可表示范围。

std::overflow_error

:数值过大导致溢出。

std::underflow_error

:浮点下溢。

比如你在做除法运算,分母可能是0,那应该抛出

std::runtime_error("division by zero")

两者的主要区别在于错误发生的时间点和是否可以通过编程预防。

如何选择正确的异常类型?

抛出合适的异常类型,能让调用者更容易理解和处理错误。以下是一些实用建议:

如果是内存分配失败,优先考虑

std::bad_alloc

。如果是类型转换问题,看情况使用

std::bad_cast

std::bad_typeid

。如果是你自己写的逻辑错误,继承

std::logic_error

。如果是系统资源、IO或外部依赖出错,用

std::runtime_error

更合适。尽量不要直接抛

std::exception

,也不要裸抛字符串。

举个实际的例子:你写了一个解析配置文件的函数,如果文件格式不对,可以抛

std::invalid_argument

;如果读取过程中出现磁盘错误,就抛

std::runtime_error

另外,在捕获异常时,最好按引用捕获(

const std::exception&

),避免不必要的拷贝和对象切片。

基本上就这些。

以上就是C++标准库异常类型有哪些 详解std exception及其派生类的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1469094.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月18日 17:50:47
下一篇 2025年12月18日 17:51:01

相关推荐

  • C++11的nullptr为什么替代NULL 类型安全指针空值的优势

    nullptr被引入是为了解决null在类型安全方面的缺陷,特别是重载函数中的二义性问题。1. nullptr的类型为std::nullptr_t,只能隐式转换为指针或bool类型,避免了null在函数重载时因可转换为整数或指针带来的歧义;2. 使用nullptr可提升代码可读性,明确表示空指针意图…

    2025年12月18日 好文分享
    000
  • C++移动语义如何影响类设计 右值引用在类中的运用

    c++++类设计需重视移动语义以提升性能和资源管理效率。1. 类应定义移动构造函数和移动赋值运算符,否则编译器可能不自动生成,默认行为可用=default显式声明;2. 实现移动操作可避免深拷贝,通过“窃取”临时对象资源提高效率,如交换指针而非复制内存;3. 使用std::move触发成员变量的移动…

    2025年12月18日 好文分享
    000
  • 怎样理解C++的作用域规则 局部全局命名空间作用域解析

    c++++的作用域规则主要包括局部作用域、全局作用域和命名空间作用域。1. 局部作用域指变量在函数或代码块内定义,生命周期止于该作用域结束,同名变量在嵌套作用域中内层遮蔽外层;2. 全局作用域中的变量在所有函数之外定义,生命周期贯穿整个程序运行期,可被多个文件访问但应尽量少用;3. 命名空间作用域通…

    2025年12月18日 好文分享
    000
  • 如何实现C++的自定义内存分配器 重载new运算符实例

    c++++中实现自定义内存分配器是通过重载new和delete运算符来控制内存分配与释放。1. new负责分配内存并调用构造函数,delete负责调用析构函数并释放内存;2. 可以重载全局或类级别的new/delete,类级别更常用,便于针对性优化;3. 自定义new需返回void*指针并处理内存不…

    2025年12月18日 好文分享
    000
  • 自定义删除器在智能指针中的应用 C++资源释放扩展方案

    自定义删除器在智能指针中用于灵活扩展资源释放机制。1. 它解决默认delete操作的局限,如处理非new分配内存、系统资源释放、数组释放、额外清理操作及内存池管理;2. 实现方式包括函数指针、仿函数和lambda表达式,均可绑定到unique_ptr或shared_ptr;3. shared_ptr…

    2025年12月18日 好文分享
    000
  • 微服务通信:gRPC + Protobuf性能调优指南

    微服务通信性能优化的核心在于减少数据大小、提高序列化效率和优化网络传输。1.protobuf schema 优化包括:优先使用 int32、int64 等基本类型,避免用 string 存储数字;将频繁字段放前面以提升 varint 编码效率;列表元素少时使用 packed=true 减少 over…

    2025年12月18日 好文分享
    000
  • 如何重载运算符?使用operator关键字定义

    运算符重载是c++++中赋予已有运算符新含义的技术,例如让复数对象用+相加。实现时需用operator关键字定义函数,如complex operator+(const complex& a, const complex& b); 重载可作为成员函数或全局函数实现,前者适合访问内部数据…

    2025年12月18日 好文分享
    000
  • C++11后结构体有哪些新特性 初始化列表与默认成员初始化

    c++++11为结构体和类引入了统一初始化和默认成员初始化两大特性,提升了代码安全性、可读性和维护性。①统一初始化通过{}语法统一了各类初始化形式,防止窄化转换并解决“最令人烦恼的解析”问题;②默认成员初始化允许在类定义中直接设置成员默认值,避免未初始化变量带来的未定义行为,减少构造函数重复代码;③…

    2025年12月18日 好文分享
    000
  • C++容器reserve方法何时使用 预分配内存对性能影响实测分析

    reserve()应在预知大数据量且频繁插入时使用以减少扩容次数提升性能。vector或string在添加元素时自动扩容,但频繁扩容导致内存重分配和拷贝,影响效率。若提前调用reserve()预分配足够空间,则可避免多次扩容。适合场景包括:1)已知最终容量;2)频繁push_back/append操…

    2025年12月18日 好文分享
    000
  • constexpr是什么?编译时计算的常量表达式

    c++onstexpr 是 c++11 引入的关键字,用于声明编译期可求值的常量表达式。1. 它适用于变量或函数在编译时即可确定结果的情况,如数组大小、模板参数和小型计算;2. 与 const 不同,constexpr 强调编译时常量性,而 const 仅表示只读;3. constexpr 可用于变…

    2025年12月18日 好文分享
    000
  • 怎样用C++实现原型模式 深拷贝与克隆接口的设计考量

    原型模式需要深拷贝是因为浅拷贝会导致新旧对象共享内部资源,修改一个对象的数据可能影响另一个对象,破坏对象独立性。1. 深拷贝确保每个对象拥有独立的资源副本,避免数据干扰;2. 使用智能指针如 std::unique_ptr 可自动管理内存,防止内存泄漏;3. 对于多态成员,需递归调用 clone()…

    2025年12月18日 好文分享
    000
  • 怎样在C++模板代码中处理异常 类型萃取与异常安全设计

    c++++模板代码中的异常处理尤其复杂,原因在于类型行为的不确定性、隐式操作的连锁反应以及异常保证的传播问题。1. 类型行为的不确定性使模板无法预知t的操作是否会抛出异常;2. 隐式操作如构造、析构、移动等可能在未知情况下引发异常,导致状态不一致;3. 异常保证的传播受限于被调用函数的最低安全等级。…

    2025年12月18日 好文分享
    000
  • 如何用C++处理文件系统符号链接 解析与创建软硬链接

    c++++17通过std::filesystem库提供了跨平台处理符号链接的完整方案。1.创建符号链接使用create_symlink(文件或目录)和create_directory_symlink(专用于目录),允许创建悬空链接;2.硬链接通过create_hard_link实现,要求目标必须存在…

    2025年12月18日 好文分享
    000
  • 如何避免智能指针的误用导致资源泄漏 常见陷阱与最佳实践

    智能指针可能导致资源泄漏的三个主要原因是循环引用、unique_ptr所有权转移失败和自定义删除器使用不当。1. 避免shared_ptr循环引用的方法是使用weak_ptr打破循环,使其不增加引用计数;2. unique_ptr所有权转移失败常见于复制尝试、未使用std::move或返回局部uni…

    2025年12月18日 好文分享
    000
  • C++异常处理与移动语义如何协作 移动操作中的异常安全问题

    在c++++中,移动语义与异常处理的协作至关重要。1. 移动构造函数应避免抛出异常,并使用noexcept声明以确保标准库能安全使用;2. 异常安全级别要求移动操作在失败时保持原状或不抛异常;3. 实现自定义类型时应简化资源转移逻辑,优先使用标准库类型,并避免在移动中调用可能抛异常的操作。例如,通过…

    2025年12月18日 好文分享
    000
  • 智能指针如何与工厂模式配合 返回智能指针的工厂函数实现

    智能指针与工厂模式结合的核心在于通过工厂函数返回智能指针(如std::unique_ptr或std::shared_ptr)以实现对象创建与生命周期管理的职责分离。1. 工厂函数负责根据参数动态创建派生类实例并封装进智能指针,客户端无需手动释放内存;2. std::unique_ptr适用于单一所有…

    2025年12月18日 好文分享
    000
  • C++怎么处理资源管理 C++资源管理的智能指针应用

    c++++处理资源管理的核心是raii思想,通过智能指针实现自动内存管理。1. unique_ptr用于独占所有权,确保单一所有者销毁时释放资源;2. shared_ptr用于共享所有权,通过引用计数自动释放资源;3. weak_ptr作为观察者避免循环引用问题。智能指针相比原始指针更安全、简洁,还…

    2025年12月18日 好文分享
    000
  • C++协程性能如何优化 无栈协程与调度器实现要点

    c++++协程性能优化需从整体架构出发,具体包括:1. 避免频繁创建销毁协程,通过对象池复用协程上下文;2. 设计贴近场景的调度器,关注线程亲和性、优先级调度与负载均衡;3. 优化无栈协程内存占用,控制promise对象大小并提升缓存命中率;4. 减少co_await嵌套与上下文切换,提升执行效率。…

    2025年12月18日 好文分享
    000
  • 联合体在C++中有何特殊用途 共享内存空间的典型案例

    联合体的特殊用途主要体现在共享内存空间上。它允许不同数据类型使用同一块内存地址,但同一时间只能存储其中一个成员的值。1. 联合体是一种特殊类类型,所有成员共享同一段内存空间,其大小等于最大成员的大小,且所有成员从同一地址开始存放。2. 共享内存空间的实际用途包括:节省内存空间,在结构体中只需保存不同…

    2025年12月18日 好文分享
    000
  • 如何优化结构体访问性能 CPU缓存友好型结构体设计原则

    优化结构体访问性能的核心在于提升cpu缓存利用率,具体方法包括:1. 利用空间局部性,将频繁一起访问的数据成员相邻存放;2. 合理调整结构体成员顺序和对齐方式,减少填充字节并提高缓存行使用效率;3. 根据访问模式选择aos或soa结构,匹配主要数据访问需求;4. 避免伪共享,通过填充、数据局部化、结…

    2025年12月18日 好文分享
    000

发表回复

登录后才能评论
关注微信