一.异常

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

二.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"。

C++之 try语句块和异常处理相关推荐

  1. C++primer 第 5 章语句 5.2语句作用域 5.3条件语句 5 . 4 迭代语句 5.5跳转语句 5.6 try语句块和异常处理

    5 . 1 简单语句 C++语言中的大多数语句都以分号结束,一个表达式,比如ival + 5 , 末尾加上分号就变成了表达式语句(expression statement).表达式语句的作用是执行表达 ...

  2. c++try语句块和异常处理

    异常处理包括: 1.throw表达式:异常检测部分使用throw表达式来表示它遇到了无法处理的问题,我们说,throw引发了异常 2.try语句块:异常处理部分使用try语句块处理异常.try语句块以 ...

  3. java中 在一个异常处理中什么语句块是可多个的

    java中 在一个异常处理中什么语句块是可多个的 参考文章: (1)java中 在一个异常处理中什么语句块是可多个的 (2)https://www.cnblogs.com/zhuyeshen/p/10 ...

  4. 关于 Java 中 finally 语句块的深度辨析

    可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机.接下来我就带您一步一步的揭开这个 finally 的神秘面纱. 问题分析 首先来问大家一个问题:finally 语句块一定 ...

  5. oracle游标语法举例,PL/SQL语句块基本语法(ORACLE存储过程,函数,包,游标)

    1.PL/SQL语句块 PL/SQL语句块只适用于Oracle数据库,使用时临时保存在客户端,而不是保存在数据库. 基本语法: declare 变量声明.初始化 begin 业务处理.逻辑代码 exc ...

  6. python表示语句块采用_Python学习日记

    江林楠学习了一下午后给大家呈现的20分钟速成Python-- 一些基本的语法: 1.python无变量声明 直接a = []即可. 2.python为对齐语言,用制表符表示语句块的嵌套. 3.pyth ...

  7. oracle sql循环判断语句怎么写,Oracle 非常详细的 PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理...

    PL/SQL入门教程目录 Oracle PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理 一.PL/SQL简介 1.PL/SQL简介 1.PL/SQl是过程语言PL与结构化语言 ...

  8. python中使用什么划分语句块_Python 使用符号() 标示注释,以() 划分语句块。_学小易找答案...

    [填空题]import numpy as np arr=np.array([[1,2,3],[4,5,6],[7,8,9]]) 则arr[0]为 ,arr[1][1]为 . [填空题]4 . 幂 级数 ...

  9. Oracle学习笔记_PL/SQL语句块

    推荐一个学习视频:https://www.bilibili.com/video/BV1AX4y1T7KG?spm_id_from=333.1007.top_right_bar_window_custo ...

最新文章

  1. 来自Mozilla的CSS书写规范建议
  2. 推荐陈永真著作《高效率开关电源设计与制作》
  3. FIFOQueue '_4_batch_processing/batch_join/fifo_queue' is closed and has insu
  4. asp.net ajax聊天室,ASP.NET MVC4异步聊天室的示例代码
  5. IOS Animation-CAShapeLayer、UIBezierPath与Animation的结合
  6. Oracle数据库卸载
  7. html5点击切换选项卡,简单纯js实现点击切换TAB标签实例
  8. 的底层实现 ios_iOS 面试梳理
  9. Kotlin学习系列(二)
  10. django mysql 2059_Django mysqlclient后端生成django.db.utils。操作错误:(2059,NULL)在Windows中...
  11. 计算机桌面显示本地磁盘c,开机自动打开本地磁盘C的解决办法
  12. QPS、TPS、PV、UV、GMV、IP、RPS?
  13. java map 为空_java中如何判断map是否为空
  14. C++ 牛客网普及组第二次测试B
  15. 优先深度搜索判断曲线相交_深度优先搜索(Depth-first search)是如何搜索一张图的?...
  16. Java多线程教学演示系统_Java多线程演示样例(模拟通话,sleep,join,yield,wait,notify,Semaphore)...
  17. matlab2009a安装包,matlab2009a安装
  18. python如何实现简单的宠物管理系统
  19. 数学分析教程(科大)——1.11笔记+习题
  20. win10右键卡顿原因_win10右键新建卡顿怎么办

热门文章

  1. CodeForces 360A - Levko and Array Recovery【动规】
  2. java saml_java – 验证SAML响应的签名
  3. 2017北京计算机博士后,2017北京电子科技大学招聘博士后公告
  4. AcWing 110. 防晒
  5. 银行(Account)
  6. 关于withRouter的原理和用法
  7. 家用NAS流媒体平台Plex、Kodi、VideoStation、Jellyfin简单使用对比
  8. PL SQL远程连接数据库
  9. 2700分+!统信UOS+龙芯3A4000最新Unixbench跑分出炉
  10. 判断链表是否有环(集合快慢指针)