C++ 的异常处理详解

news/2024/11/8 4:59:41 标签: c++, 经验分享

C++ 的异常处理详解

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

1. 什么是异常?

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

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

2. 如何抛出异常?

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

throw 数据;

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

3. 如何捕获异常?

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

try {
    // 可能会产生异常的代码或函数调用
} catch (类型名& 变量名) {
    // 处理错误
}
示例中分母为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++ 函数可以使用异常说明,定义该函数可能抛出的异常类型。格式如下:

返回值 函数名(参数列表) 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. 自定义异常类

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

#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. 在捕获父子类异常时,先捕获子类类型,再捕获父类类型。这样可以确保子类异常被正确处理。

注意:trycatch 块之间不能有任何语句。

总结

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


http://www.niftyadmin.cn/n/5743255.html

相关文章

用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门(三)

概述 从 WWDC 24 开始&#xff0c;苹果推出了全新的测试机制&#xff1a;Swift Testing。利用它我们可以大幅度简化之前“老态龙钟”的 XCTest 编码范式&#xff0c;并且使得单元测试更加灵动自由&#xff0c;更符合 Swift 语言的优雅品味。 在这里我们会和大家一起初涉并领略…

压力测试,探索服务器性能瓶颈

什么是全链路压力测试&#xff1f; 全链路压力测试是指基于真实业务场景&#xff0c;通过模拟海量的用户请求&#xff0c;对整个后台服务进行压力测试&#xff0c;从而评估整个系统的性能水平。 创建全链路压力测试 第一步&#xff1a;准备测试数据 为了尽量模拟真实的业务…

RabbitMQ 高级特性——消息分发

文章目录 前言消息分发RabbitMQ 分发机制的应用场景1. 限流2. 负载均衡 前言 当 RabbitMQ 的队列绑定了多个消费者的时候&#xff0c;队列会把消息分发给不同的消费者&#xff0c;每条消息只会发送给订阅列表的一个消费者&#xff0c;但是呢&#xff0c;RabbitMQ 默认是以轮询…

Eslint 和 Prettier

提示&#xff1a;ESLint 和 Prettier 是两个常用的工具&#xff0c;它们在 JavaScript 生态系统中扮演着重要角色&#xff0c;但它们的功能和目的有所不同。 一、ESLint是什么&#xff1f; 1.目的&#xff1a; ESLint 是一个静态代码分析工具&#xff0c;主要用于查找和修复 …

WPF中的INotifyPropertyChanged接口

INotifyPropertyChanged 是一个在 WPF (Windows Presentation Foundation) 和 .NET 中使用的接口&#xff0c;它用于实现数据绑定时的数据更新通知。当实现了 INotifyPropertyChanged 接口的类的属性值发生变化时&#xff0c;这个接口允许对象通知绑定到该对象属性的 UI 元素&a…

【华为机试题】光伏场地建设规划 [Python]

题目 代码 class Solution:def func(self, input_args, area_list):count 0for i in range(input_args[0] - input_args[2] 1):for j in range(input_args[1] - input_args[2] 1):count 1 if self.area_compute(area_list,i,j,input_args[2],input_args[3]) else 0print(c…

Mac解决 zsh: command not found: ll

Mac解决 zsh: command not found: ll 文章目录 Mac解决 zsh: command not found: ll解决方法 解决方法 1.打开bash_profile 配置文件vim ~/.bash_profile2.在文件中添加配置&#xff1a;alias llls -alF键盘按下 I 键进入编辑模式3. alias llls -alF添加完配置后&#xff0c;按…

数据仓库之 Atlas 血缘分析:揭示数据流奥秘

Atlas血缘分析在数据仓库中的实战案例 在数据仓库领域&#xff0c;数据血缘分析是一个重要的环节。血缘分析通过确定数据源之间的关系&#xff0c;以及数据在处理过程中的变化&#xff0c;帮助我们更好地理解数据生成的过程&#xff0c;提高数据的可靠性和准确性。在这篇文章中…