C++ 的异常处理详解

C++ 的异常处理详解

在编程过程中,错误和异常是不可避免的,合理的异常处理机制能够提高程序的健壮性。在 C++ 中,异常机制为捕获和处理错误提供了一种结构化的方式。本文将对 C++ 的异常处理进行详细探讨,包括异常的概念、如何抛出和捕获异常、标准异常、自定义异常类以及在使用异常时需要注意的问题。

1. 什么是异常?

异常是指程序在执行过程中出现的意外情况。当代码发生错误时,程序会停止执行并返回特定的数据。C 语言中只能通过返回值来处理错误,而 C++ 则允许程序员通过异常机制更方便地管理错误。

在 C++ 中,您可以接收自己返回的值或系统返回的值,根据返回数据的类型不同,执行相应的错误处理逻辑。

2. 如何抛出异常?

在 C++ 中,可以使用 throw 关键字抛出异常。例如:

cpp 复制代码
throw 数据;

这里的 "数据" 可以是任何类型的对象或值,但注意不要抛出局部变量的地址或引用。

3. 如何捕获异常?

使用 try 和 catch 块来捕获异常。具体的代码结构如下:

cpp 复制代码
try {
    // 可能会产生异常的代码或函数调用
} catch (类型名& 变量名) {
    // 处理错误
}
c++ 复制代码
示例中分母为0,显然属于异常
#include<iostream>
#include<stdexcept>
using namespace std;

class DivideByZeroException : public runtime_error 
{
public:
    DivideByZeroException() : runtime_error("除数为0") {}
};
int main()
{
    int a, b, c;
    cout << "Enter three numbers: ";
    cin >> a >> b ;
    try
    {
        if(b == 0)
        {
            throw DivideByZeroException();
        }
         else
         {
            c = a / b;
            cout << "The result is: " << c << endl;
         }   
       
    }catch (const DivideByZeroException& e)
    {
        cout << e.what() << endl;
    }
    cout<<"程序结束"<<endl;

    return 0;


}

在 try 块内的代码如果发生异常,将执行相应的 catch 块来处理这些异常。

4. 异常说明

C++ 函数可以使用异常说明,定义该函数可能抛出的异常类型。格式如下:

cpp 复制代码
返回值 函数名(参数列表) throw(类型1,类型2,...) {
    // 函数实现
}

异常说明相当于对函数使用者的承诺:函数只能抛出说明过的异常类型。如果抛出了未在说明中列出的异常类型,程序将产生运行时错误。

5. 标准异常

C++ 定义了一些标准异常类。在发生对应异常时,会自动抛出这些定义好的异常类对象。主要的标准异常包括:

  • exception:所有标准 C++ 异常的基类,可以捕获所有标准异常。
  • bad_alloc:通过 new 抛出,表示内存不足。C++11 中会抛出其子类 bad_array_new_length。
  • bad_cast:通过 dynamic_cast 抛出。
  • bad_exception:处理无法预期的异常。
  • bad_typeid:通过 typeid 抛出。
  • logic_error:理论上可以通过读取代码来检测到的异常。

6. 自定义异常类

除了标准异常外,开发者还可以自定义异常类,以满足特定需求。以下是一个自定义异常类的示例:

cpp 复制代码
#include <string>

class ZZError {
    std::string time;
    std::string file;
    std::string func;
    size_t line;
    std::string erro;
public:
    ZZError(const std::string& time, const std::string& file, const std::string& func, const size_t& line, const std::string& erro)
        : time(time), file(file), func(func), line(line), erro(erro) {}
};

自定义异常类可以包含更多上下文信息,便于错误追踪和调试。

7. 使用异常需要注意的问题

在使用异常处理机制时,需要注意以下事项:

  1. 不要返回局部变量、对象的地址,但可以返回临时对象。
  2. 建议使用引用捕获异常,以避免对象的构造和拷贝造成开销。
  3. 不要在构造函数和析构函数中抛出异常。如果构造函数抛出异常,对象将无法被构造;如果析构函数抛出异常,可能会导致程序崩溃。
  4. 在捕获父子类异常时,先捕获子类类型,再捕获父类类型。这样可以确保子类异常被正确处理。

注意:try 和 catch 块之间不能有任何语句。

总结

C++ 的异常处理机制为程序员提供了强大的工具来捕获和处理错误,增强了代码的健壮性和可维护性。通过合理利用标准异常和自定义异常类,我们可以更有效地进行错误管理,提高代码的健壮性和可读性。

相关推荐
CodeYp20192 小时前
第15讲:二叉搜索树
开发语言·c++·二叉搜索树
pipixia200333 小时前
C++继承面试四连问:内存叠加、私有继承、sizeof、权限重映射
c++·面试·嵌入式·继承·面向对象·对象模型
牵猫散步的鱼儿5 小时前
C++ 内存分区
c++
choumin6 小时前
C++ 标准容器为什么不能存引用
c++·容器·引用类型
tianxuanjg6 小时前
采购指南|航空复杂结构件高精度 CNC 加工采购选型指南
人工智能·经验分享·机器人·制造·材质
谙弆悕博士6 小时前
用 C 写了个 Windows 聊天室,踩了几个多线程和控制台的坑
c语言·开发语言·c++·windows·网络编程·聊天室
stolentime7 小时前
CF2277E Tree Guessing题解
c++·算法·贪心算法·交互·ad-hoc
杨逢昌工厂6S管理7 小时前
126-杨逢昌6S三环体系:越做越乱的现场熵增机理与基准化治理——一线现场诊断笔记
经验分享·笔记·职场和发展·学习方法
2601_967212727 小时前
可移动轨道插座安全结构、场景适配与安装技术说明
大数据·经验分享·安全
syagain_zsx7 小时前
ODB 与 MySQL:C++ 里的 ORM 实践(类即表、事务铁律与查询封装)
开发语言·数据库·c++·mysql·工具库·1024程序员节