C++之 try语句块和异常处理

2023-05-16

一.异常

异常是指存在于代码运行时的反常行为,这些反常行为超出了函数正常执行功能的范围,异常处理机制包括两部分的协同支持:异常检测和异常处理

二.C++中的异常处理

在c++语言中,异常处理包括:

  • throw 表达式(throw expression):异常检测部分使用throw表达式来表示它遇到了无法处理的问题
  • try 语句块(try block):try语句块用来处理异常,try语句块以关键字try开始,以一个或多个catch子句结束,try语句块中代码抛出的异常通常会被某个catch子句处理
  • 一套异常类(exception class):用于在throw表达式和相关的catch子句之间传递异常的具体信息

2.1 throw表达式

举例:输入两个整数变量值,判断是否相等

    int a,b;
    cin>>a>>b;
    if(a==b){
        cout<<"equal"<<endl;
    }else{
        cout<<"not equal,please input again"<<endl;
    }

我们暂时把不相等作为一种异常,把输出不相等的信息作为与用户的交互,在真实的程序中,应该把代码正常执行和与用户的交互分离开,即在不相等时抛出异常:

    if(a!=b){
        throw runtime_error("not equal,please input again");        //随机选取的异常类型
    }  
    cout<<"equal"<<endl;        //若程序执行到这一句表示程序没有异常

具体的异常类型分类和异常类型后面括号内跟随的表达式的意义会在文章第三部分讲解

在该程序中,若a和b不相等,就会抛出一个runtim_error类型的异常,抛出异常将终止当前的函数,并把控制权转移给能处理该异常的代码

 2.2 try语句块

try语句块通常的语法格式:

try {
    program-statements
} catch (exception-declaration) {
    handler-statements
} catch (exception-declaration) {
    handler-statements
} ...

try语句块内如果出现了异常,选中了某个catch子句处理异常,执行对应的块,执行完该块后,跳转到最后一个catch子句后的那一句继续执行

try语句块中的program-statements组成程序正常的逻辑,可以包括声明在内的任意c++语句,但try语句块内声明的变量在外部无法访问,即使在catch子句内也无法访问

        cin>>a>>b;
        try{
            if(a!=b){
                throw runtime_error("not equal,please input again");
            }
            cout<<"equal"<<endl;
        } catch (runtime_error err){
            cout<<err.what()<<"\ntry again? enter y or n"<<endl;
        }

 由于此程序中,try语句抛出的异常类型和catch异常声明的类型一致,即为匹配到了catch子句,在正式程序中,可能会没有匹配到catch子句,此时程序会转到terminate的标准库函数,terminate会终止当前进程的执行

 三.标准异常

C++标准库定义了一组类,用于报告标准库函数遇到的问题,他们分别定义在4个头文件中:

  • exception头文件定义了最通用的异常类exception,只报告异常的发生,不提供任何额外信息
  • stdexcept头文件定义了几种常用的异常类:exception,runtime_error,range_error(结果超过值域),overflow_error,underflow_error,logic_error,domain_error(参数对应的结果值不存在),invailid_argument,length_error,out_of_range
  • new头文件定义了bad_alloc异常类型
  • type_info头文件定义了bad_cast异常类型

只能以默认初始化的方式初始化exception,bad_alloc,bad_cast对象,不允许为这些对象提供初始值,其他异常类型(主要指stdexcept头文件中的异常类型)则相反,应该用string对象或者C风格字符串初始化这些类型的对象,但不允许使用默认初始化的方式,且创建此类对象时,要提高初始值,如上面写的 throw runtime_error("not equal,please input again"); 该句创建了一个runtime_error类型的对象,初始值为"not equal,please input again",异常类型只定义了一个what()成员函数,该函数没有参数,返回值是一个C风格字符串,用于提供关于异常的文本信息,一般返回的是初始化该类型对象的初始值,如上面语句返回"not equal,please input again"

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++之 try语句块和异常处理 的相关文章

  • java:try...catch跳过异常继续处理循环

    问题描述 在代码循环体中 xff0c 抛出异常后代码会停止执行 xff0c 导致代码不能完整运行 解决方案很简单 xff0c 捕获异常并简单处理一下就可以 1 捕获异常继续执行代码 只贴核心样例代码 public void getTest
  • try-catch 报错

    try catch的意义 xff1a 1 报错处理 xff0c 输出日志 2 不影响代码块之外的代码执行 xff0c 即发生发生错误后之后的代码仍然后继续执行 try catch代码块与 throws Exception方法块区别 1 tr
  • Ubuntu apt-get install 报错Try ‘apt --fix-broken install‘ with no packages (or specify a solution).

    64 toc 报错 更新镜像 更新镜像的时候修改配置文件 xff08 先修改配置文件的权限 xff09 GCC 安装错误 Recommends libc6 dev but it is not going to be installed or
  • [Errno 256] No more mirrors to try.解决过程

    今天在Linux服务器上安装rdesktop安装包的时候遇到该报错 xff0c 如图所示 xff1a df h查看挂载盘信息 xff0c 发现光驱未挂载 我设置的挂载光驱路径为 media cdrom 解决过程 xff1a 1 挂载光驱 m
  • 打好基础之try-catch-finally执行顺序

    try catch finally是用来捕获异常 xff0c 保证程序的执行 先看一小段代码 xff1a public class TryCatchDemo public static void main String args div 4
  • Java面向对象之异常处理机制(try-catch-finally、throws、自定义异常)

    文章目录 一 异常与异常分类二 异常处理机制1 try catch处理2 try catch finally处理3 throws可能抛异常 xff08 少用 xff09 4 throw抛出异常 xff08 少用 xff09 三 自定义异常
  • C++之 try语句块和异常处理

    一 异常 异常是指存在于代码运行时的反常行为 xff0c 这些反常行为超出了函数正常执行功能的范围 xff0c 异常处理机制包括两部分的协同支持 xff1a 异常检测和异常处理 二 C 43 43 中的异常处理 在c 43 43 语言中 x
  • try anbox or waydroid (by quqi99)

    作者 张华 发表于 2022 06 28 版权声明 可以任意转载 转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 无论是安装anbox还是waydroid都失败了 记录一下 里面首先是没有 dev binder的问题 那是因
  • 使用 TRY/CATCH 语句解决 SQL Server 2005 死锁

    对于今天的 RDBMS 体系结构而言 xff0c 死锁难以避免 在高容量的 OLTP 环境中更是极为普遍 正是由于 NET 的公共语言运行库 CLR 的出现 xff0c SQL Server 2005 才得以为开发人员提供一种新的错误处理方
  • c++_exception异常,try和catch,noexcept,throw

    catalog noexcept 函数base自定义异常类noexcept 和 throw noexcept 函数 bool f 61 noexcept func 判断 func 函数 是否有标记noexcept base throw 是
  • try{}catch(res){}、throw(exception)、new Error()

    1 try catch res try 中的代码出现错误异常时 xff0c 系统会将异常信息封装到error对象中 xff0c 传递给catch res xff0c 包含res message res name等 EvalError eva
  • try catch里面try catch嵌套

    try catch里能否内嵌try catch xff1f 答案是肯定的 但是等内层try catch出异常之后是个什么执行顺序呢 xff1f 看下面代码 static void Main string args try Console W
  • 远程登录阿里云服务器时,提示Permission denied, please try again.

    在使用ssh命令 xff0c 远程登录阿里云服务器时 xff0c 提示Permission denied please try again 百分之九十的可能 xff1a 你的密码错了 xff01 你需要注意的是 xff0c 我们的实例有两个
  • Install ncurses (ncurses-devel) and try again.

    主要就是终端图形配置时最容易出现的问题 xff0c 比如最常见的make menuconfig xff0c 解决方法 xff1a sudo apt get install ncurses devel 屏幕弹出 xff1a 找不到这个软件 x
  • try catch里面try catch嵌套

    try catch里面try catch嵌套 点击打开链接 try 与catch的作用 首先要清楚 xff0c 如果没有try的话 xff0c 出现异常会导致程序崩溃 而try则可以保证程序的正常运行下去 xff0c 比如说 xff1a t
  • 解决“Permission denied, please try again.”的问题

    在Ubuntu的终端输入命令 ssh highlight highlight是本地主机名称提示输入用户密码 当密码输入正确时 xff0c 仍返回错误 xff1a Permission denied please try again 解决的办
  • try catch finally执行顺序

    try catch finally执行顺序 内容简介代码示例执行结果 xff1a 分析 内容简介 代码中经常会在catch 或者finally中再次抛出异常 xff0c 传给调用者 xff08 如文件上传处理工具类 xff09 xff0c
  • throw 和 try catch 的区别

    try catch是直接处理 xff0c 处理完成之后程序继续往下执行 xff0c throw则是将异常抛给它的上一级处理 xff0c 程序便不往下执行了
  • OpenMP task 原理与实例

    个人理解 Openmp自从3 0以后全面走向任务驱动 task机制非常重要 可以显式定义任务 而其余parallel代码块中不用task定义的实际上是隐式任务 抽象来说就是有两个池子 线程池与任务池 闲置的线程会在线程池等待任务 显式任务与
  • Java:简述try-catch-finally中return返回

    Java 简述try catch finally中return返回 Java 详解Java中的异常 Error与Exception Java 简述Java中的自定义异常 Java 简述throw throws异常抛出 Java 简述try

随机推荐

  • Anaconda下配置pytorch cuda安装最简方法

    很多入门深度学习的伙计 xff0c 经常被pytorch torchvision cuda xff0c cuda toolkit搞得云里雾里 好在使用anaconda能轻松安装pytorch和torchvision这两个包 xff0c 却没
  • ERROR: Failed building wheel for mujoco-py

    安装mujoco最后一步 xff0c 出现这个错误 前面所有步骤都get到 xff0c 包括下载mjkey 安装VC 43 43 buildtools 下载mjpro150与对应版本的mujoco py 在很多教程中 xff0c 都提及最后
  • 一招解决 pip 代理问题

    打开 96 控制面板 96 gt 96 网络和Internet 96 勾选这个选项 xff1a 具体原因未知 xff0c 但是有奇效 此后anaconda Navigator等一众无法自动配置代理的工具也畅通无阻
  • IDEA 启动报错could not find main class com/intellij/idea/main解决办法

    1 现象 安装完首次打开 intellij 出现 could not find main class com intellij idea main 2 解决办法 You should create IDEA JDK 64 environme
  • error in pycallgraph setup command: use_2to3 is invalid.

    solution Downgrade setuptools gt 61 58 gt lt 58 pip install setuptools 61 61 57 5 0
  • Linux Ubuntu 安装onedrive 依赖库缺失

    The following packages have unmet dependencies onedrive Depends libphobos2 ldc shared98 gt 61 1 1 28 0 but it is not ins
  • CCF- CSP202112-2序列查询新解 简单分段+满分题解

    CCF CSP202112 2序列查询新解 简单分段 43 满分题解 题目链接 xff1a 202112 2序列查询新解 思路 xff1a 数据最大范围为109 xff0c 因此需要采用long long类型分析样例序列A xff0c 我们
  • 第2章 关系数据库练习题

    一 设有三个关系 xff1a S xff08 sno xff0c sname xff0c age xff0c sex xff09 sc xff08 sno xff0c cno xff0c cname xff09 c xff08 cno xf
  • 数字的逆序输出

    include lt stdio h gt int main 将一个数字逆序输出 printf 34 请输入一个数字 xff1a n 34 int number scanf 34 d 34 amp number printf 34 逆转后的
  • ENSP教程---OSPF单区域配置实验

    目录 一 实验目标 二 拓扑图 三 配置基本环境 四 配置OSPF 五 修改 OSPF hello dead时间参数 七 控制OSPF xff24 R BDR的选举 八 配置信息 一 实验目标 掌握OSPF 中Router ID 的配置方法
  • Java判断回文序列

    经典的回文序列判断问题 xff0c 博主在学数据结构时遇到的一道作业题 xff0c 当时老师让用栈做的 xff0c 将我自己写的程序分享一下 xff1a 题目 xff1a 编写一个程序判别读入的字符序列是否为 回文序列 xff0c 所谓回文
  • 定义一个数组,然后从键盘输入10个整数,编程求出其最大值、最小值以及平均值(C语言)

    本程序使用了定义冒泡排序函数和定义求平均函数的方法 include lt stdio h gt include lt math h gt void Bubblesort int a int len int i j temp for j 61
  • 「Atcoder」abc242 题解

    A T shirt Code span class token keyword void span span class token function solve span span class token punctuation span
  • websocket的reconnecting-websocket的使用

    1 引用 reconnecting websocket js npm i reconnecting span class token operator span websocket 2 建立websocket ts span class t
  • nextcloud+nginx+ssl+非443,踩坑记录

    需求描述 pc 移动端app必须都支持 为了省阿里云服务器流量 xff0c 服务器需要的三个访问路径 1 需要内网可以通过ip 43 port直接访问 2 外网可以通过ddns访问 xff0c 因为443和80端口都被封 xff0c 只能换
  • 【python学习笔记】

    一 基础知识 1 字面量 xff1a 被写下来的固定的值 2 单行注释符 xff1a 单行注释内容 ps xff1a 注释符后要有个空格 3 多行注释 xff1a 34 34 34 多行注释内容 34 34 34 4 查看变量和字面量类型
  • linux命令(包含基础命令和进阶命令)大全

    拷贝 xff1a yy 删除 xff1a dd 末行 xff1a G 首行 xff1a gg 设置行号 xff1a set u 撤销 xff1a u 定位某行 xff1a 行号 shift 43 g 关机 xff1a shutdown ha
  • 汇编语言学习笔记

    一 绪论 所用教材 xff1a 汇编语言第3版 王爽老师 xff0c 清华大学出版社 1 从机器语言到汇编语言 机器语言是机器指令的集合 xff0c 汇编指令是机器指令的助记符 xff0c 汇编指令通过编译器转换成机器可以识别的01机器码
  • 机器学习笔记

    一 绪论 1 监督学习 给定一个数据集 xff0c 且已经表明了 正确答案 1 1回归问题 xff1a 预测一个连续值输出 xff1b 分类问题 xff1a 预测一个离散值输出 2 无监督学习 给定一个未表明意义的数据集 xff0c 将其分
  • C++之 try语句块和异常处理

    一 异常 异常是指存在于代码运行时的反常行为 xff0c 这些反常行为超出了函数正常执行功能的范围 xff0c 异常处理机制包括两部分的协同支持 xff1a 异常检测和异常处理 二 C 43 43 中的异常处理 在c 43 43 语言中 x