C++Primer 异常处理
异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。
检测出问题的部分发出某信号表明程序遇到了故障,而且信号的发出方无须知道故障将在何处得到解决。
异常处理机制为程序中异常检测和异常处理这两部分协作提供支持。
异常处理包括:
throw表达式 异常检测部分使用throw表达式来表示它遇到了无法处理的问题。我们说throw引发了异常。
包含关键字throw和紧跟其后的一个表达式,其中表达式的类型就是抛出的异常类型。
if ( a != b)
throw runtime_error("data must refer to same number");
cout << a + b << endl;
如果a不等于b,抛出一个异常,该异常是类型runtime_error的对象。抛出异常将终止当前的函数,并把控制权转移给能处理该异常的代码。我们必须初始化runtime_error对象,方式是给提供一个string对象或者一个C风格的字符串,这个字符串中有一些关于异常的辅助信息。
try语句块 用来处理异常。以关键字try开始,并以一个或多个catch子句结束。try语句块中代码抛出的异常通常会被某个catch子句处理。因为catch子句“处理”异常,所以它们也被称作异常代码处理。
try语句块通用语法形式
try{
program-statements
} catch (exception-declaration){
handler-statements
} catch (exception-declaration){
handler-statements
} //...
catch子句包括三部分:关键字catch、括号内一个(可能未命名的)对象的声明(称作异常声明)以及一个块。当选中了某个catch子句处理异常之后,执行与之对应的块。catch一旦完成,程序跳转到try语句块最后一个catch子句之后的那条语句块继续执行。
try语句块中的program-statements 组成程序的正常逻辑,可以有包括声明在内的任意C++语句。try语句块中声明的变量在快外部无法访问,特别是在catch子句内无法访问。
一套异常类 用于在throw表达式和相关的catch子句之间传递异常的具体信息
eg.
while(cin >> a >> b){
try{
//执行添加a与b对象的代码,添加失败抛出runtime_error异常
}catch (runtime_error err){
//提醒用户a与b必须一直,询问是否重新输入
cout << err.what()
<< "\nTry again? Enter y or n" << endl;
char c;
cin >> c;
if ( !cin || c == 'n') break;
}
}
what()是runtime_error类的一个成员函数。每个标准库异常类都定义了what成员函数,无参数,返回(const char*)。其中,runtime_error的what返回的是初始化一个具体对象时所用的string对象的副本。
处理异常的过程
当异常被抛出时,首先搜索抛出该异常的函数。如果没有找到匹配的catch语句,终止该函数,并在调用该函数的函数中继续搜寻。若还没有catch子句,这个函数也终止,继续搜索调用它的函数。以此类推,直到找到适当类型的catch子句为止。
如果最终还没找懂啊,程序转到terminate的标准库函数。该函数的行为与系统有关,一般情况下,执行该函数将导致程序正常退出。
标准异常
C++标准库定义了一组类,用于报告标准函数库遇到的问题。这些类也可在用户编写的程序中使用。
头文件
- exception 定义了最通用的异常类exception。只报告异常的发生。
- stdexcept 定义了几种异常类,如下图
- new 定义了bad_alloc异常类型
- type_info 定义了bad_cast 异常类型
标准库异常类只定义了几种运算符,包括创建或拷贝异常类型的对象,以及为异常类型的对象赋值。
我们只能以默认初始化的方式初始化exception、bad_alloc和bad_cast对象,不允许为这些对象提供初始值。
其他异常类型的行为则恰好相反:应该使用string对象或者C风格字符串初始化这些类型的对象,但不允许使用默认初始化的方式。当创建此类对象时,必须提供初始值,该值含有错误相关的信息。
异常类型只定义了一个名为what的成员函数,无参数,返回值为(const char*)。目的是提供关于异常的一些文本信息。其返回的C风格字符串的内容与异常对象的类型有关。若异常类型有一个字符串初始值,则what返回该字符串。对于其他无初始值的异常类型来说,what返回的内容由编译器决定。
PS:
默认初始化
如果定义变量时没有指定初值,则变量被默认初始化。
默认值到底是什么由变量类型决定,同时定义变量的位置也会对此有影响。
内置类型的变量未被显示初始化,其值由位置决定。函数外的变量被初始化为0。(默认初始化的例外,定义于函数内的内置类型变量将不被初始化)
每个类各自决定其初始化对象的方式。而且,是否允许不经初始化就定义对象也由类自己决定。如果类允许这种行为,它将决定对象的初始值到底是什么
绝大多数类都支持无须显示初始化而定义对象,这样的类提供一个合适的默认值。一些类要求每个对象都显示初始化,如果创建对象未初始化,将引发错误。
C++Primer 异常处理的更多相关文章
- C++ Primer 有感(异常处理)
1.异常是通过抛出对象而引发的.该对象的类型决定应该激活哪个处理代码.被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个. 2.执行throw的时候,不会执行跟在throw后面的语句 ...
- C++ Primer 学习笔记_88_用于大型程序的工具 --异常处理[续1]
用于大型程序的工具 --异常处理[续1] 四.又一次抛出 有可能单个catch不能全然处理一个异常.在进行了一些校正行动之后,catch可能确定该异常必须由函数调用链中更上层的函数来处理,catch能 ...
- C++ Primer 学习笔记_87_用于大型程序的工具 --异常处理
用于大型程序的工具 --异常处理 引言: C++语言包括的一些特征在问题比較复杂,非个人所能管理时最为实用.如:异常处理.命名空间和多重继承. 相对于小的程序猿团队所能开发的系统需求而言,大规模编程[ ...
- C++ Primer 有感(异常处理)(三)
先看下面的代码: [cpp] view plaincopy int main() { int *i=new int(10); /* 这中间的代码出现异常 */ delete i; return 0; ...
- C++ Primer 笔记——异常处理
1.栈展开过程沿着嵌套函数的调用链不断查找,直到找到了与异常匹配的catch句子为止,或者也可能一直没找到匹配的catch,则程序将调用terminate,退出主函数后查找过程终止.假设找到了一个ca ...
- C++ Primer 有感(异常处理)(四)
查看普通函数的声明的时候,不可能知道该函数会抛出什么异常,但是在捕获异常的时候要知道一个函数会抛出什么样的异常,以便捕获异常. 异常说明:指定,如果函数抛出异常,抛出的异常将是包含在该说明中的一种,或 ...
- C++ Primer 有感(异常处理)(二)
异常就是运行时出现的不正常,例如运行时耗尽了内存或遇到意外的非法输入.异常存在于程序的正常功能之外,并要求程序立即处理.不能不处理异常,异常是足够重要的,使程序不能继续正常执行的事件.如果找不到匹配的 ...
- C++的异常处理
一.什么是异常处理 一句话:异常处理就是处理程序中的错误. 二.为什么需要异常处理,以及异常处理的基本思想 C++之父Bjarne Stroustrup在<The C++ Programming ...
- 转载:看c++ primer 学习心得
学习C++ Primer时遇到的问题及解释 chenm91 感觉: l 啰嗦有时会掩盖主题:这本书确实有些啰嗦,比如在讲函数重载的时候,讲了太长一大段(有两节是打了*号的,看还是不看 ...
随机推荐
- maven打包源码<转>
Plugin: http://maven.apache.org/plugins/maven-source-plugin/ The Source Plugin has five goals: sourc ...
- Android—— Intent参数this问题
Android Intent参数this问题 (2013-04-02 11:19:48) 转载▼ 标签: android intent 分类: Android 转自:http://blog.csdn. ...
- uboot中变量env(收集)
Env在u-boot中通常有两种存在方式,在永久性存储介质中(flash.NVRAM等),在SDRAM中.可配置不适用env的永久存储方式,但不常用.U-boot在启动时会将存储在永久性存储介质中的e ...
- C++类的实例化对象的大小之sizeof()
之所以写这篇<C++类的实例化对象的大小之sizeof()>.是由于在參加笔试的时候遇到例如以下这么一道题,当时感觉就是这个一个坑,但.我还是义无反顾的跳了下去,由于存在知识点盲区啊.现, ...
- Web API(五):Web API跨域问题
一.什么是跨域问题 跨域:指的是浏览器不能执行其他网站的脚本.是由浏览器的同源策略造成的,是浏览器施加的安全限制.(服务端可以正常接收浏览器发生的请求,也可以正常返回,但是由于浏览器的安全策略,浏览器 ...
- spring—Bean配置
Spring是一个开源的框架,其目标是简化java的开发.为了降低Java开发的复杂性,Spring有如下的特性: >> 基于POJO的轻量级和最小侵入性编程 >> 通过依赖注 ...
- svn删除项目目录
cmd svn delete -m "质控" svn://192.168.0.253/repos1/质控
- php 删除指定文件 glob,unlink
我用最简单的语句写了一个php删除指定文件 因为一直越级挑战thinkphp,所以突然面对php有点无所适从了... 首先,php的运行机制,是一个语法就搞定了,还是非要用数据库,还是post什么的. ...
- 解决只有单引号的Json格式转换成bean问题
objectMapper.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);单引号类似Json格式:{id:124463277,code:null ...
- 如今在 Internet 上流传的“真正”的程序员据说是这样的
如今在 Internet 上流传的“真正”的程序员据说是这样的: (1) 真正的程序员没有进度表,只有讨好领导的马屁精才有进度表,真正的程序员会让 领导提心吊胆. (2) 真正的程序员不写使用说明书, ...