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;
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/675073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#系列-面向对象特性继承封装多态(2)

C#继承 在C#中&#xff0c;继承是面向对象编程的一个核心概念&#xff0c;它允许一个类&#xff08;派生类或子类&#xff09;继承另一个类&#xff08;基类或父类&#xff09;的属性和方法。通过继承&#xff0c;子类可以重用基类的代码&#xff0c;同时还可以添加新的成员或重…

高考志愿填报模拟系统的功能和技术总结

一、金秋志愿高考志愿填报系统主要功能&#xff1a; 用户注册与登录&#xff1a;允许学生和家长注册账号&#xff0c;使用注册的账号登录系统。 个人信息管理&#xff1a;允许用户查看、修改个人信息&#xff0c;如姓名、性别、联系方式等。 高考成绩输入&#xff1a;学生输…

windows上卸载完程序后,清理残余文件,无法删除的情况处理

现象&#xff1a;通常在卸载完软件后&#xff0c;要删除残余文件或者移动残余文件时候&#xff0c;会弹出来 原因&#xff1a; 因为文件被其他程序已经加载&#xff0c;处理的目标是找到使用这个文件的进程&#xff0c;然后kill掉。类似于linux上的lsof命令查找到进程号&…

SpringOne2023解读-01-使用spring-cloud-contract与TestContainer构建可靠程序

个人创作公约&#xff1a;本人声明创作的所有文章皆为自己原创&#xff0c;如果有参考任何文章的地方&#xff0c;会标注出来&#xff0c;如果有疏漏&#xff0c;欢迎大家批判。如果大家发现网上有抄袭本文章的&#xff0c;欢迎举报&#xff0c;并且积极向这个 github 仓库 提交…

如何在vue中使用拖动排序组件sortablejs

效果图&#xff1a; 1.首先&#xff0c;我们需要在vue项目中安装依赖&#xff1a; npm install -save sortablejs2.创建demo文件>demoTest.vue&#xff0c;直接附上实例代码&#xff1a; <template><div><div id"table-names"><div class&…

如何使用CLZero对HTTP1.1的请求走私攻击向量进行模糊测试

关于CLZero CLZero是一款功能强大的模糊测试工具&#xff0c;该工具可以帮助广大研究人员针对HTTP/1.1 CL.0的请求走私攻击向量进行模糊测试。 工具结构 clzero.py - 工具主脚本&#xff1b; default.py - 包含了大多数标准攻击测试方法和字符&#xff1b; exhaustive.py - 包…

山西电力市场日前价格预测【2024-02-08】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-08&#xff09;山西电力市场全天平均日前电价为200.58元/MWh。其中&#xff0c;最高日前电价为347.58元/MWh&#xff0c;预计出现在07:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

Redhat7.9/Centos7.9配置双网卡bonding

一、网卡bonding及其7种模式简介&#xff1a; 1、网卡bonding&#xff1a; 一台服务器如果只有一块网卡&#xff0c;当这块网卡故障时&#xff0c;服务器网络就会瘫痪。bonding&#xff08;绑定&#xff09;是一种Linux系统下的网卡绑定技术&#xff0c;是Linux系统内核层面实…

蓝桥杯第八届省赛题笔记------基于单片机的电子钟程序设计与调试

题目要求&#xff1a; 一、基本要求 1.1 使用 CT107D 单片机竞赛板&#xff0c;完成“电子钟”功能的程序设计与调试&#xff1b; 1.2 设计与调试过程中&#xff0c;可参考组委会提供的“资源数据包”&#xff1b; 1.3 Keil 工程文件以准考证号命名&#xff0c;保存在…

RibbonOpenFeign源码(待完善)

Ribbon流程图 OpenFeign流程图

python3实现gitlab备份文件上传腾讯云COS

gitlab备份文件上传腾讯云COS 脚本说明脚本名称&#xff1a;upload.py 假设gitlab备份文件目录&#xff1a;/opt/gitlab/backups gitlab备份文件格式&#xff1a;1706922037_2024_02_06_14.2.1_gitlab_backup.tar1.脚本需和gitlab备份文件同级目录 2.根据备份文件中的日期判断…

C++面向对象编程:explicit关键字

explicit关键字的作用就是防止有一个参数的类构造函数进行隐式自动转换。 所以explicit只能用于修饰只有一个参数的类构造函数,表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。 explicit…

Yii特性

Yii几乎拥有了当今Web 2.0应用发展的全部特性。下面是这些特性的一个简短的清单。 模型-视图-控制器&#xff08;MVC&#xff09;设计模式&#xff1a;Yii在WEB编程中采用这一成熟的技术从而可以更好的将逻辑层和表现层分开。数据库访问对象&#xff08;DAO&#xff09;和Acti…

Unity学习笔记之【IK反向动力学操作】

反向动力学Inverse Kinematics 反向动力学&#xff0c;简称IK。相较于正向动力学&#xff0c;反向动力学旨在子级对父级产生的影响。 使用IK&#xff0c;可以实现根据目标位置或方向来计算并调整角色的关节&#xff08;骨骼&#xff09;链&#xff0c;以使角色的末端&#xff…

一、OpenAI API介绍

Open AI API可以应用到任何的业务场景。 文本生成 创造助理 嵌入数据 语音转化 图片生成 图片输入 1. 核心概念 1.1 Text generation models OpenAI 的文本生成模型(通常被称为generative pre-trained transformers 模型简称&#xff1a;GPT),有GPT-4和G…

Node.js_基础知识(全局变量)

介绍 global&#xff1a;相当于浏览器里的window对象process&#xff1a; 是nodejs用来控制和管理进程的工具 主要方法&#xff1a; cwd&#xff1a;获取当前的工作目录&#xff0c;是执行node命令时候的项目地址。补充&#xff1a;__dirname是被执行的js文件地址。chdir&…

无头浏览器 Puppeteer-案例demo

一、无头浏览器 Puppeteer基础介绍&#xff1a; 我们日常使用浏览器的步骤为&#xff1a; 启动浏览器、打开一个网页、进行交互。而无头浏览器指的是我们使用脚本来执行以上过程的浏览器&#xff0c;能模拟真实的浏览器使用场景。 有了无头浏览器&#xff0c;我们就能做包括但…

(十六)springboot实战——spring securtity的认证流程源码解析

前言 本节内容是关于spring security安全框架认证流程的源码分析&#xff0c;spring security的认证流程主要是在UsernamePasswordAuthenticationFilter过滤器中实现的。我们会通过源码层级的分析&#xff0c;了解清楚spring security的底层是如何实现用户的认证的。 正文 1…

MySQL数据库练习【二】

MySQL数据库练习【二】 一、MySQL基本语法二、建库建表-数据准备三、MySQL经典50题-题目四、MySQL经典50题-答案4.1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数4.2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数4.…

云计算运维1

1、企业服务器LNMP环境搭建 集群&#xff1a;多台服务器在一起作同样的事 。分布式 &#xff1a;多台服务器在一起作不同的事 。 环境准备&#xff1a; 1、设置静态ip&#xff08;NAT模式网关为.2&#xff09; # cat /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE"E…