C++ exception 类

本文详细介绍了C++标准异常的分类及其子类,包括逻辑错误、运行时错误、内存分配失败等异常,并解释了如何捕获这些异常以及它们的具体含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++语言本身或者标准库抛出的异常都是 exception 的子类,称为标准异常(Standard Exception)。你可以通过下面的语句来捕获所有的标准异常:

<code class="language-cpp">    try{  
        //可能抛出异常的语句  
    }catch(exception &e){  
        //处理异常的语句  
    }</code>  

之所以使用引用,是为了提高效率。如果不使用引用,就要经历一次对象拷贝(要调用拷贝构造函数)的过程。
exception 类位于 头文件中,它被声明为:

<code class="language-cpp">    class exception{  
    public:  
        exception () throw();  //构造函数  
        exception (const exception&) throw();  //拷贝构造函数  
        exception& operator= (const exception&) throw();  //运算符重载  
        virtual ~exception() throw();  //虚析构函数  
        virtual const char* what() const throw();  //虚函数  
    }</code>  

what() 函数返回一个能识别异常的字符串,正如它的名字“what”一样,可以粗略地告诉你这是什么异常。
exception 类的继承层次:
这里写图片描述

exception 类的直接派生类:
logic_error逻辑错误。
runtime_error运行时错误。
bad_alloc使用 new 或 new[ ] 分配内存失败时抛出的异常。
bad_typeid使用 typeid 操作一个 NULL 指针,而且该指针是带有虚函数的类,这时抛出 bad_typeid 异常。
bad_cast使用 dynamic_cast 转换失败时抛出的异常。
ios_base::failure io 过程中出现的异常。
bad_exception这是个特殊的异常,如果函数的异常列表里声明了 bad_exception 异常,当函数内部抛出了异常列表中没有的异常时,如果调用的 unexpected() 函数中抛出了异常,不论什么类型,都会被替换为 bad_exception 类型。

logic_error 的派生类:
length_error试图生成一个超出该类型最大长度的对象时抛出该异常,例如 vector 的 resize 操作。
domain_error参数的值域错误,主要用在数学函数中,例如使用一个负值调用只能操作非负数的函数。
out_of_range超出有效范围。
invalid_argument参数不合适。在标准库中,当利用string对象构造 bitset 时,而 string 中的字符不是 0 或1 的时候,抛出该异常。

runtime_error 的派生类:
range_error计算结果超出了有意义的值域范围。
overflow_error算术计算上溢。
underflow_error算术计算下溢。

### C++ 中的异常处理教程与最佳实践 #### 异常处理机制概述 C++ 提供了一种结构化的错误处理方式——异常处理。当程序遇到无法继续执行的情况时,可以抛出一个异常对象来表示这种状态。捕获并处理这些异常可以使程序更加健壮和可靠。 为了使 C++ 方法能够被托管代码调用,C++ 的异常需要映射到返回值或输出参数中[^1]。这允许托管环境识别发生的错误,并可以选择性地通过抛出托管异常的方式传播原始 C++ 异常。 #### 抛出异常 在 C++ 中,`throw` 关键字用于引发异常: ```cpp if (error_condition) { throw std::runtime_error("An error has occurred"); } ``` 这里创建了一个 `std::runtime_error` 对象作为异常实例传递给运行时系统去寻找匹配的处理器。 #### 捕捉异常 使用 try-catch 块捕捉可能产生的异常: ```cpp try { // 可能会抛出异常的操作 } catch(const std::exception& e) { // 处理标准库中的任何异常型 std::cerr << "Caught exception: " << e.what() << '\n'; } catch(...) { // 捕获所有未指定型的异常 std::cerr << "Unknown exception caught\n"; } ``` #### 资源管理与 RAII 资源获取即初始化(RAII)是一种重要的编程模式,在 C++ 编程中有广泛应用。它确保了即使发生异常也能正确释放资源。通常情况下,应该利用智能指针或其他容器自动管理动态分配的对象生命周期。 #### 设计良好的 API 接口 设计优雅且易于使用的接口对于提高开发效率至关重要。遵循 Qt 风格的设计原则有助于构建直观易懂的 C++ 库函数[^2]。例如,保持一致性的命名约定、提供清晰文档说明以及合理运用模板技术等都是良好做法的一部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值