c++中异常处理

ops/2024/11/14 7:57:16/

一、C++ 中的异常处理机制

  • 基本原理:C++ 异常处理机制提供了一种在程序运行期间处理错误和异常情况的结构化方式。它基于 trycatch 和 throw 三个关键字来实现。当程序中出现异常情况时,可以使用 throw 表达式抛出一个异常对象,然后在可能捕获该异常的 try 块之后的 catch 块中进行处理。
  • try 块try 块中包含可能会抛出异常的代码。当 try 块中的代码执行时,如果发生了异常,程序的执行流程会立即跳转到相应的 catch 块中进行处理,try 块中剩余的代码将不会被执行。
  • catch 块catch 块用于捕获和处理由 try 块中抛出的异常。一个 try 块可以跟多个 catch 块,每个 catch 块可以捕获特定类型的异常。当异常被抛出时,程序会按照 catch 块出现的顺序依次检查每个 catch 块,找到与抛出的异常类型匹配的第一个 catch 块,并执行其中的代码来处理异常。
  • 异常对象throw 表达式抛出的异常可以是任何类型的对象,通常建议使用自定义的异常类来表示不同类型的异常情况。异常对象可以携带有关异常的详细信息,例如错误代码、错误消息等,以便在 catch 块中进行更准确的处理。

格式: 

try
{// 保护代码
}
catch( ExceptionName1 e1 )//第一种异常
{// catch 块
}
catch( ExceptionName2 e2 )//第二种异常
{// catch 块
}
catch( ExceptionName3 eN )//第三种异常
{// catch 块
}

我们把会抛出异常的代码放到try代码块里面,再用catch关键字捕获异常。如下:

#include <iostream>
using namespace std;
double division(double a, double b)
{try{if (b == 0){throw "出现了除数为0的错误";//throw关键字抛出错误类型 const char*}}catch (const char* error_string)//捕获const char*类型的错误{cout << error_string << endl;//打印它}return (a / b);
}
int main()
{cout << division(1, 0);
}

二、应该使用异常处理的情况

  • 函数可能无法完成其预定任务时:例如一个函数用于打开一个文件并读取其中的数据,但如果文件不存在或者无法打开,就可以抛出一个异常来通知调用者该操作失败,而不是返回一个特殊的错误码。
  • 资源分配失败时:当使用 new 运算符动态分配内存失败时,会抛出 bad_alloc 异常。同样,在使用其他资源(如网络连接、数据库连接等)时,如果资源分配或初始化失败,也可以通过异常来处理。
  • 库函数或第三方代码中的错误:当调用库函数或第三方代码时,如果它们内部发生了错误并通过异常来通知调用者,那么在调用这些函数的代码中就需要使用异常处理来捕获和处理这些异常,以保证程序的稳定性。
  • 逻辑错误或违反前置条件时:如果函数的参数不符合预期的前置条件,或者程序执行到某个逻辑上不应该出现的情况时,可以抛出异常来表示程序的状态异常。

三、异常处理的优点

  • 分离错误处理代码和正常业务逻辑:使得代码的结构更加清晰,正常的业务逻辑可以专注于实现功能,而错误处理逻辑则集中在 catch 块中,提高了代码的可读性和可维护性。
  • 增强程序的健壮性:能够及时捕获和处理运行时出现的各种异常情况,避免程序因未处理的异常而崩溃,使程序更加稳定可靠。
  • 提供了一种统一的错误处理机制:无论异常在程序的哪个层次或哪个函数中抛出,都可以通过异常处理机制将其传递到合适的地方进行处理,使得整个程序的错误处理更加一致和规范。
  • 便于错误信息的传递和处理:异常对象可以携带详细的错误信息,使得在 catch 块中可以根据具体的异常类型和错误信息进行更有针对性的处理,例如向用户显示友好的错误提示,或者记录详细的错误日志等。

四、异常处理的缺点

  • 性能开销:异常处理机制在一定程度上会影响程序的性能。当抛出异常时,程序需要进行一些额外的操作来查找匹配的 catch 块,这可能会导致一定的时间开销。在一些对性能要求极高的场景中,可能需要谨慎使用异常处理。
  • 增加代码复杂性:如果过度使用异常处理或者异常处理不当,可能会导致代码变得复杂难以理解。例如,过多的 try 和 catch 块嵌套会使代码的执行流程难以跟踪,增加了代码的维护难度。
  • 异常安全问题:在使用异常处理时,需要特别注意资源的释放和对象的状态管理,以确保程序在发生异常后仍然处于一个合理的状态。如果处理不当,可能会导致资源泄漏、对象状态不一致等问题。

http://www.ppmy.cn/ops/133507.html

相关文章

SystemC学习(4)— 在VCS中运行SystemC

SystemC学习&#xff08;4&#xff09;— 在VCS中运行SystemC 一、前言 参考&#xff1a;VCS编译verilog&SystemC 二、仅包含SystemC的仿真 源文件使用上一篇&#xff1a;SystemC学习&#xff08;3&#xff09;— APB_SRAM的建模与测试 编写makefile如下所示&#xff…

数据库参数备份

MySQL #!/bin/bash # 获取当前日期和时间的时间戳 TIMESTAMP$(date "%Y%m%d-%H%M%S")# 0、创建目录 mkdir /tmp/parameter_$TIMESTAMP/# 1、获取所有命名空间 echo "1、获取所有命名空间" NAMESPACES$(kubectl get ns | grep qfusion- | grep -v qfusion-…

本地 Hadoop 开发环境搭建详解

### 本地 Hadoop 开发环境搭建详解 Hadoop 是处理大规模数据的核心工具之一&#xff0c;在大数据分析、机器学习和数据仓库等场景中应用广泛。为了方便开发和调试&#xff0c;搭建一个本地 Hadoop 环境是一个很好的选择。本文将详细介绍如何在本地搭建一个单节点的 Hadoop 环境…

prompt资料收集

1. LANGgpt模板 # Role: 知识探索专家 ## Profile: - - 即刻App即刻App&#xff0c;享受探索、表达和创造https://m.okjike.com/originalPosts/649801f1ba47fe581a0da471?seyJ1IjoiNjQyM2IwMDE4NDg5Njk1NGJjYzhkNWU1IiwiZCI6MX0%3D2. 好的prompt的标准 主观的说&#xff1a;…

【深度解析】CSS工程化全攻略(1)

在现代前端开发中&#xff0c;随着项目的规模越来越大&#xff0c;CSS 代码的管理和维护变得越来越重要。传统的 CSS 编写方式在大型项目中存在诸多问题&#xff0c;如类名冲突、重复样式、文件细分等。为了解决这些问题&#xff0c;社区提出了多种解决方案&#xff0c;包括命名…

OpenGL ES 文字渲染方式有几种?

在音视频或 OpenGL 开发中,文字渲染是一个高频使用的功能,比如制作一些酷炫的字幕、为视频添加水印、设置特殊字体等等。 实际上 OpenGL 并没有定义渲染文字的方式,所以我们最能想到的办法是:将带有文字的图像上传到纹理,然后进行纹理贴图。 本文分别介绍下在应用层和 C+…

通俗易懂:什么是 Java 类加载?

文章目录 类加载过程的三个阶段一个简单的案例&#xff1a;类加载的工作原理使用这个类类加载的顺序类加载的特点类加载的好处总结推荐阅读文章 在 Java 中&#xff0c; 类加载是一种将我们写的 Java 类文件加载到内存中的过程&#xff0c;让 JVM&#xff08;Java 虚拟机&…

软件设计师 - 第2章 程序设计语言基础知识

语言分类 按照级别分类 低级语言&#xff1a;汇编语言高级语言&#xff1a;C&#xff0c;C&#xff0c;C#&#xff0c;Java&#xff0c;Python等 按照翻译形式分类 汇编&#xff1a;源代码经汇编程序翻译后执行解释&#xff1a;源代码经解释器解释后执行或者翻译成中间代码…