当前位置: 首页 > news >正文

C/C++ - 异常处理

目录

错误处理

异常处理

异常传播

异常规划

标准异常

自定异常


错误处理

  • 在C语言中,错误通常通过函数的返回值来表示。

  • 错误返回值

    • 对于能返回特殊值(如NULL或负值)的函数,在调用时检查这些值来处理错误。
    • #include <stdio.h>
      #include <stdlib.h>#define DIV_RET_SUCCESS 1
      #define DIV_RET_FAILED  0//C语言中通过函数返回值来判断执行成功与否
      int myDiv(int num1, int num2, int* nRet)
      {if (num2 == 0){*nRet - 0;return DIV_RET_FAILED;}*nRet = num1 / num2;return DIV_RET_SUCCESS;
      }int main()
      {int ret = 0;if (myDiv(10, 2, &ret) == DIV_RET_SUCCESS){printf("%d \r\n", ret);}return 0;
      }
      
  • 错误码全局变量

    • 如 errno​​​,这是一个全局变量,很多标准库函数在出错时会设置这个变量为相应的错误码。
    • #pragma warning(disable:4996)
      #include <stdio.h>
      #include <stdlib.h>
      #include <errno.h>
      #include <string.h>int main()
      {FILE* pFile = NULL;pFile = fopen("0xCC.txt", "r");if (pFile == NULL){printf("ErrorCode -> %d \r\n", errno);printf("ErrorMesg -> %s \r\n", strerror(errno));perror("fopen");}return 0;
      }
      
  • 宏定义

    • 通过宏定义可以创建简单的错误处理代码块,这个方法提供了一种快速插入常用错误处理程序代码的方式。
    • #include <stdio.h>
      #include <stdlib.h>
      #define HANDLE_ERROR(msg) \do { \perror(msg); \exit(EXIT_FAILURE); \} while(0)
      int main() 
      {FILE *fp = fopen("file.txt", "r");if (!fp) {HANDLE_ERROR("Error opening file");}// 其余代码...fclose(fp);return 0;
      }
      

异常处理

  • throw:当问题发生时,程序会抛出一个异常。这是通过 throw​​ 关键字完成的,后面跟着要抛出的异常对象。

    throw ErrorCode
    throw "Erroe"
    
  • try:try​​ 块内的代码是可能产生异常的代码,当其中的代码抛出一个异常时,执行流会跳转到匹配的 catch​​ 块。

  • catch:catch​​ 块会捕获异常,并包含如何处理这些异常的代码。

    try
    {//可能抛出异常的代码
    }
    catch(ExceptionType var)	//根据异常类型捕获
    {//处理匹配异常类型
    }
    catch(ExceptionType var)	//根据异常类型捕获
    {//处理匹配异常类型
    }
    
  • 示例代码

    #include <iostream>int AllocMem()
    {//可能会抛出异常的代码放在try语句块内try{//throw 'A';long long* p = new long long[0xFFFFFFF];//thorw bad_allocation}catch (int exception){std::cout << exception << std::endl;}catch (char exception){std::cout << exception << std::endl;}catch (std::exception exception){std::cout << exception.what() << std::endl;}}int main()
    {AllocMem();return 0;
    }
    

异常传播

  • C++异常传播(Exception Propagation)是指在程序中如果一个函数内发生了异常,而该异常没有在该函数内得到处理,则该异常会被传递到函数调用者处,如果调用者也不处理,则继续传递,这样一直到最顶层调用者。如果最顶层调用者也没有处理异常,则程序可能崩溃。

    • 如果try​​​块内的代码抛出了异常,控制流会跳到第一个匹配的catch​​​块。
    • 如果在当前函数中没有匹配的catch​​​块,异常会被传递给调用该函数的函数,并在那里寻找匹配的catch​​​块。
    • 如果在任一函数中都找不到匹配的catch​​块,程序将调用terminate()​​结束程序。
    #include <iostream>void Fun3()
    {throw 0xCC;
    }void Fun2()
    {try{Fun3();}catch (char exception){std::cout << exception << std::endl;}}void Fun1()
    {try{Fun2();}catch (float exception){std::cout << "Fun1 Exception" << std::endl;}}int main()
    {try{Fun1();}catch (...){std::cout << "Main Exception" << std::endl;}return 0;
    }
    

异常规划

  • 异常规范(exception specification)是C++中的一种功能,它允许开发者指明一个函数可能抛出哪些异常。
  • 自从C++11起,异常规范已经不再被推荐使用,取而代之的是noexcept关键字。
  • ​void someFunction() throw(int, char); ​​// 只能抛出int型和char型异常
  • ​void someFunction() noexcept; ​​// 不会抛出异常
  • #include <iostream>
    #include <vector>//该函数不会抛出任何异常
    void Fun1() throw()
    {}void Fun2() noexcept
    {}void Fun3() throw(int)
    {}void Fun4() throw(char)
    {}void Fun5() throw(char, int)
    {}int main()
    {try{Fun3();}catch (int exception){std::cout << exception << std::endl;}try{Fun4();}catch (char exception){std::cout << exception << std::endl;}try{Fun5();}catch (char exception){std::cout << exception << std::endl;}catch (int exception){std::cout << exception << std::endl;}return 0;
    }
    

标准异常

  • ​std::exception​​ 是各种标准异常类的基础,提供了一个异常层次结构。
  • ​std::logic_error​​

    • 逻辑错误表示程序的逻辑不当导致的问题,这通常是可以预防的错误。
    • ​std::domain_error​​: 当一个数学函数接收到一个不在其定义域内的参数时抛出。
    • ​std::invalid_argument​​: 当传递给函数的参数无效时抛出。
    • ​std::length_error​​: 当创建过大的 std::string​​ 或者 std::vector​​ 时抛出。
    • ​std::out_of_range​​: 当通过 at​​ 访问 std::vector​​ 或 std::string​​ 而下标超出范围时抛出。
  • std::runtime_error​​

    • 运行时错误,表示在程序运行时发现的错误,通常是难以预防的。
    • ​std::overflow_error​​: 当算术运算超过表示范围时抛出。
    • ​std::underflow_error​​: 当算术运算结果在正确的表示范围内,但非正规化时抛出。
    • ​std::range_error​​: 当计算的结果不在可表示的范围内时抛出。
    • ​std::system_error​​: 用于报告系统错误的异常。
  • std::bad_alloc​​

    当动态内存分配失败时(如 new​​ 表达式),std::bad_alloc​​ 被抛出。

  • std::bad_cast​​​

    使用动态转换 (dynamic_cast​​) 转换到不兼容的类型时,抛出 std::bad_cast​​。

  • std::bad_typeid​​​

    当使用类型信息功能(如 typeid​​ 操作符)并且操作的对象是未定义类型时,抛出 std::bad_typeid​​ 异常。

  • ​std::bad_function_call​​​

    当调用一个空的 std::function​​ 对象时,抛出 std::bad_function_call​​ 异常。

  • #include <iostream>int main()
    {try{long long* p = new long long[0xFFFFFFF];}catch (const std::exception& e){std::cout << e.what() << std::endl;}return 0;
    }
    

自定异常

  • #include <iostream>class myException :public std::exception
    {
    public:myException(std::string message): m_Message(message){}virtual const char* what() const{return m_Message.c_str();}private:std::string m_Message;
    };int main()
    {try{myException obj("cc exception");throw obj;}catch (const std::exception& e){std::cout << e.what() << std::endl;}return 0;
    }
    

相关文章:

C/C++ - 异常处理

目录 错误处理 异常处理 异常传播 异常规划 标准异常 自定异常 错误处理 在C语言中&#xff0c;错误通常通过函数的返回值来表示。 错误返回值 对于能返回特殊值&#xff08;如NULL或负值&#xff09;的函数&#xff0c;在调用时检查这些值来处理错误。 #include <st…...

十、项目开发总结报告(软件工程)

1&#xff0e;引言 1.1编写目的 1.2项目背景 1.3定义 1.4参考资料 2&#xff0e;开发结果 2.1产品 2.2主要功能及性能 2.3所用工时 2.4所用机时 2.5进度 2.6费用 3&#xff0e;评价 3.1生产率评价 3.2技术方案评价 3.3产品质量评价 4&#xff…...

在 VMware 虚拟机上安装 CentOS系统 完整(全图文)教程

一、前期准备&#xff1a; 1.安装VMware 虚拟机软件&#xff08;不在讲解&#xff0c;可自行去下载安装&#xff09;。官网&#xff1a;https://customerconnect.vmware.com/cn/downloads/details?downloadGroupWKST-PLAYER-1750&productId1377&rPId111471 2.下载iso…...

吉他学习:右手拨弦方法,右手拨弦训练 左手按弦方法

第六课 右手拨弦方法https://m.lizhiweike.com/lecture2/29362775 第七课 右手拨弦训练https://m.lizhiweike.com/lecture2/29362708...

【初识爬虫+requests模块】

爬虫又称网络蜘蛛、网络机器人。本质就是程序模拟人使用浏览器访问网站&#xff0c;并将需要的数据抓取下来。爬虫不仅能够使用在搜索引擎领域&#xff0c;在数据分析、商业领域都得到了大规模的应用。 URL 每一个URL指向一个资源&#xff0c;可以是一个html页面&#xff0c;一…...

微信小程序(三十八)滚动容器

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.滚动触底事件 2.下拉刷新事件 源码&#xff1a; index.wxml <view class"Area"> <!-- scroll-y 垂直滚动refresher-enabled 允许刷新bindrefresherrefresh 绑定刷新作用函数bindscrollto…...

Python学习之路-Tornado基础:数据库

Python学习之路-Tornado基础:数据库 简介 与Django框架相比&#xff0c;Tornado没有自带ORM&#xff0c;对于数据库需要自己去适配。我们使用MySQL数据库。 在Tornado3.0版本以前提供tornado.database模块用来操作MySQL数据库&#xff0c;而从3.0版本开始&#xff0c;此模块…...

Golang的for循环变量和goroutine的陷阱,1.22版本的更新

先来看一段golang 1.22版本之前的for循环的代码 package mainimport "fmt"func main() {done : make(chan bool)values : []string{"chen", "hai", "feng"}for _, v : range values {fmt.Println("start")go func() {fmt.P…...

List 差集

文章目录 基本类型对象类型 基本类型 ListUtils.subtract 方法用于计算两个集合的差集&#xff0c;即返回 list1 中有但 list2 中没有的元素。 其中&#xff0c;list1 指向第一个集合&#xff0c;list2 指向第二个集合。该方法返回一个新的 List 对象&#xff0c;它包含所有在…...

ArcGIS的UTM与高斯-克吕格投影分带要点总结

UTM&#xff08;通用横轴墨卡托投影、等角横轴割椭圆柱投影&#xff09;投影分带投影要点&#xff1a; 1&#xff09;UTM投影采用6度分带 2&#xff09;可根据公式计算&#xff0c;带数&#xff08;经度整数位/6&#xff09;的整数部分31 3&#xff09;北半球地区&#xff0…...

华为第二批难题一:基于预训练AI模型的元件库生成

我的理解&#xff1a;华为的这个难道应该是想通过大模型技术&#xff0c;识别元件手册上的图文内容&#xff0c;与现有建库工具结合&#xff0c;有潜力按标准生成各种库模型。 正好&#xff0c;我们正在研究&#xff0c;利用知识图谱技术快速生成装配模型&#xff0c;其中也涉…...

Android AOSP源码研究之万事开头难----经验教训记录

文章目录 1.概述2.Android源下载1.配置环境变量2.安装curl3.下载repo并授权4.创建一个文件夹保存源码5.设置repo的地址并配置为清华源6.初始化仓库7.指定我们需要下载的源码分支并初始化 2.1 使用移动硬盘存放Android源码的坑2.2 解决方法 3.Android源码编译4.Android源烧录 1.…...

动态数据源

一、部署 1、导入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.1.0</version></dependency>2、编写yml 配置文件 spring:datasource:dyna…...

2024.1.29力扣每日一题——自由之路

2024.1.29 题目来源我的题解方法一 动态规划 题目来源 力扣每日一题&#xff1b;题序&#xff1a;514 我的题解 方法一 动态规划 定义 dp[i][j] 表示从前往后拼写出 key的第 i个字符&#xff0c; ring 的第 j个字符与 12:00 方向对齐的最少步数&#xff08;下标均从 0 开始&…...

Qt应用软件【协议篇】UDP示例

UDP协议简介 UDP(用户数据报协议)是一种无连接的网络协议,提供了简单但是不可靠的消息传输服务。与TCP不同,UDP不保证数据包的顺序、重复性或者可达性,但它在速度和效率上具有优势,特别适合那些对实时性要求高的应用,如视频流、在线游戏等。 Qt中的UDP编程 在Qt中,U…...

MyBatis之动态代理实现增删改查以及MyBatis-config.xml中读取DB信息文件和SQL中JavaBean别名配置

MyBatis之环境搭建以及实现增删改查 前言实现步骤1. 编写MyBatis-config.xml配置文件2. 编写Mapper.xml文件&#xff08;增删改查SQL文&#xff09;3. 定义PeronMapper接口4. 编写测试类1. 执行步骤2. 代码实例3. 运行log 开发环境构造图总结 前言 上一篇文章&#xff0c;我们…...

百面嵌入式专栏(面试题)内存管理相关面试题1.0

沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将介绍内存管理相关面试题 。 一、内存管理相关面试题 page数据结构中的_refcount和_mapcount有什么区别?匿名页面和高速缓存页面有什么区别?page数据结构中有一个锁,我们称为页锁,请问trylock_page()和loc…...

SpringMVC 1.请求参数检查 2.全局异常处理 3.请求参数封装为Pojo

ErrorEnum.java // 枚举所有的错误 package com.example.demo.enums;import lombok.Getter;public enum ErrorEnum {SYSTEM_ERROR(-1, "系统错误"),PARAM_ERROR(-2, "参数错误"),OK(0, "成功"),;Getterprivate final int code;Getterprivate fi…...

7机器人位姿的数学描述与坐标变

由上次刚体的空间转动直接切换为机器人相关术语。 1.机器人位姿的数学描述与坐标变换 1.1位姿描述 {B}相对于{A}的姿态描述用3x3矩阵表示为&#xff1a; 式中为三个单位正交主矢量&#xff0c;分别表示刚体坐标系{B}的三个坐标轴XBYBZB在参考系{A}中的方位&#xff0c;∠XBXA表…...

基于ESP8266 开发板(MCU)遥控小车

遥控小车 ​ 遥控界面 ​ 【项目源码】 第一版ESP8266 https://github.com/liyinchigithub/esp8266_car_webServerhttps://github.com/liyinchigithub/esp8266_car_webServer 第二版ESP32 GitHub - liyinchigithub/esp32-wroom-car: 嵌入式单片机 ESP32 Arduino 遥控小车&a…...

从电视伴音收音机消亡看数字技术演进与仪器集成化趋势

1. 从一台“电视伴音收音机”说起&#xff1a;一个时代的消逝与技术演进的注脚我书桌抽屉的角落里&#xff0c;一直躺着一台老旧的收音机。它不是普通的AM/FM收音机&#xff0c;在它的波段选择旋钮上&#xff0c;除了熟悉的“AM”和“FM”&#xff0c;还有一个略显神秘的“TV”…...

【PyTorch实战】从零构建CNN模型:MNIST手写数字识别全流程解析

1. 环境准备与数据加载 第一次接触PyTorch时&#xff0c;我对着官方文档折腾了半天环境配置。后来发现用Anaconda管理Python环境真是省心&#xff0c;这里分享我的配置经验。建议先安装Anaconda最新版&#xff0c;然后创建专属环境&#xff1a; conda create -n pytorch_env py…...

基于Godot引擎的经典游戏重制:OpenClaw项目架构与实现深度解析

1. 项目概述与核心价值最近在独立游戏开发圈里&#xff0c;一个名为“OpenClaw”的开源项目热度不低。它的全称是“GambitGamesLLC/openclaw-godot”&#xff0c;简单说&#xff0c;这是一个基于Godot引擎&#xff0c;对经典DOS平台动作冒险游戏《The Claw》进行的开源重制版。…...

Bootstrap 标签页

Bootstrap 标签页 Bootstrap 标签页&#xff08;Tab&#xff09;是 Bootstrap 框架中的一种交互组件&#xff0c;允许用户在多个页面元素或内容区域之间进行切换。本文将详细介绍 Bootstrap 标签页的使用方法、特点以及如何将其应用于实际项目中。 一、Bootstrap 标签页的使用方…...

Selenium自动化测试常见的异常处理

在软件开发和测试领域,Selenium作为一种广泛使用的自动化测试工具,扮演着至关重要的角色。随着自动化测试的不断普及,如何在测试过程中有效捕获并处理异常,成为了每个测试工程师必须掌握的技能。本文旨在深入探讨Selenium异常处理的方法,通过丰富的案例和代码,帮助新手朋…...

ImageGlass:Windows平台最强图像浏览器,90+格式全支持

ImageGlass&#xff1a;Windows平台最强图像浏览器&#xff0c;90格式全支持 【免费下载链接】ImageGlass &#x1f3de; A lightweight, versatile image viewer 项目地址: https://gitcode.com/gh_mirrors/im/ImageGlass 你是否曾因Windows自带照片应用无法打开专业RA…...

12-分布式系统测试-缓存-注册中心与链路追踪验证

分布式系统测试&#xff1a;缓存、注册中心与链路追踪验证上篇咱们搞定了消息队列测试&#xff0c;今天继续深入分布式系统的其他组件——Redis缓存、服务注册中心、分布式链路追踪。这些"基础设施"的测试往往被忽略&#xff0c;但出了问题定位起来最头疼。一、Redis…...

PyTorch自动微分知识点讲解

PyTorch自动微分知识点讲解 知识导图 PyTorch自动微分 ├── 基础认知 │ ├── 自动微分的核心概念 │ └── autograd模块的作用 ├── 梯度计算 │ ├── 梯度计算的规则 │ └── backward与grad的使用 └── 实战案例├── 单参数的更新└── 多参数的更…...

在Android Termux中部署轻量级Docker环境:原理、部署与实战指南

1. 项目概述与核心价值最近在折腾移动设备上的开发环境&#xff0c;发现一个挺有意思的项目&#xff1a;George-Seven/Termux-Udocker。简单来说&#xff0c;它是在Android平台的Termux终端模拟器里&#xff0c;实现一个轻量级的、用户空间&#xff08;User-Space&#xff09;的…...

用100道题拿下你的算法面试(链表篇-7):复制带随机指针的链表

一、面试问题 给定一个链表的头节点&#xff0c;链表中每个节点都包含两个指针&#xff1a;一个指向下一个节点的 next 指针&#xff0c;以及一个指向链表中任意节点的 random 指针。请复制该链表&#xff0c;并返回新链表的头节点。 二、【朴素解法】使用哈希表 —— 时间复杂…...