C++Primer 异常处理

时间:2022-09-04 23:28:27

异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。

检测出问题的部分发出某信号表明程序遇到了故障,而且信号的发出方无须知道故障将在何处得到解决。

异常处理机制为程序中异常检测和异常处理这两部分协作提供支持。

异常处理包括:

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 定义了几种异常类,如下图

C++Primer 异常处理

  • new  定义了bad_alloc异常类型
  • type_info  定义了bad_cast 异常类型

标准库异常类只定义了几种运算符,包括创建或拷贝异常类型的对象,以及为异常类型的对象赋值。

我们只能以默认初始化的方式初始化exception、bad_alloc和bad_cast对象,不允许为这些对象提供初始值。

其他异常类型的行为则恰好相反:应该使用string对象或者C风格字符串初始化这些类型的对象,但不允许使用默认初始化的方式。当创建此类对象时,必须提供初始值,该值含有错误相关的信息。

异常类型只定义了一个名为what的成员函数,无参数,返回值为(const char*)。目的是提供关于异常的一些文本信息。其返回的C风格字符串的内容与异常对象的类型有关。若异常类型有一个字符串初始值,则what返回该字符串。对于其他无初始值的异常类型来说,what返回的内容由编译器决定。

PS:

默认初始化

如果定义变量时没有指定初值,则变量被默认初始化。

默认值到底是什么由变量类型决定,同时定义变量的位置也会对此有影响。

内置类型的变量未被显示初始化,其值由位置决定。函数外的变量被初始化为0。(默认初始化的例外,定义于函数内的内置类型变量将不被初始化)

每个类各自决定其初始化对象的方式。而且,是否允许不经初始化就定义对象也由类自己决定。如果类允许这种行为,它将决定对象的初始值到底是什么

绝大多数类都支持无须显示初始化而定义对象,这样的类提供一个合适的默认值。一些类要求每个对象都显示初始化,如果创建对象未初始化,将引发错误。

C++Primer 异常处理的更多相关文章

  1. C&plus;&plus; Primer 有感(异常处理)

    1.异常是通过抛出对象而引发的.该对象的类型决定应该激活哪个处理代码.被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个. 2.执行throw的时候,不会执行跟在throw后面的语句 ...

  2. C&plus;&plus; Primer 学习笔记&lowbar;88&lowbar;用于大型程序的工具 --异常处理&lbrack;续1&rsqb;

    用于大型程序的工具 --异常处理[续1] 四.又一次抛出 有可能单个catch不能全然处理一个异常.在进行了一些校正行动之后,catch可能确定该异常必须由函数调用链中更上层的函数来处理,catch能 ...

  3. C&plus;&plus; Primer 学习笔记&lowbar;87&lowbar;用于大型程序的工具 --异常处理

    用于大型程序的工具 --异常处理 引言: C++语言包括的一些特征在问题比較复杂,非个人所能管理时最为实用.如:异常处理.命名空间和多重继承. 相对于小的程序猿团队所能开发的系统需求而言,大规模编程[ ...

  4. C&plus;&plus; Primer 有感(异常处理)(三)

    先看下面的代码: [cpp] view plaincopy int main() { int *i=new int(10); /* 这中间的代码出现异常 */ delete i; return 0; ...

  5. C&plus;&plus; Primer 笔记——异常处理

    1.栈展开过程沿着嵌套函数的调用链不断查找,直到找到了与异常匹配的catch句子为止,或者也可能一直没找到匹配的catch,则程序将调用terminate,退出主函数后查找过程终止.假设找到了一个ca ...

  6. C&plus;&plus; Primer 有感(异常处理)(四)

    查看普通函数的声明的时候,不可能知道该函数会抛出什么异常,但是在捕获异常的时候要知道一个函数会抛出什么样的异常,以便捕获异常. 异常说明:指定,如果函数抛出异常,抛出的异常将是包含在该说明中的一种,或 ...

  7. C&plus;&plus; Primer 有感(异常处理)(二)

    异常就是运行时出现的不正常,例如运行时耗尽了内存或遇到意外的非法输入.异常存在于程序的正常功能之外,并要求程序立即处理.不能不处理异常,异常是足够重要的,使程序不能继续正常执行的事件.如果找不到匹配的 ...

  8. C&plus;&plus;的异常处理

    一.什么是异常处理 一句话:异常处理就是处理程序中的错误. 二.为什么需要异常处理,以及异常处理的基本思想 C++之父Bjarne Stroustrup在<The C++ Programming ...

  9. 转载:看c&plus;&plus; primer 学习心得

    学习C++ Primer时遇到的问题及解释 chenm91 感觉: l          啰嗦有时会掩盖主题:这本书确实有些啰嗦,比如在讲函数重载的时候,讲了太长一大段(有两节是打了*号的,看还是不看 ...

随机推荐

  1. Java 实现文件上传、下载、打包、文件copy、文件夹copy。

    文件and文件夹copy package org.test; import java.io.*; public class FileCopy { /** * 复制单个文件 * * @param old ...

  2. cookies

    Cookie[] cookies=request.getCookies(); for(Cookie c:cookies) out.println(c.getValue()+" ") ...

  3. 001&period;libev安装及eclipse下添加libev库链接

    libev库安装: 1.下载页面:http://dist.schmorp.de/libev/ 当前版本下载: [root@mid_server ~]# cd /usr/local/src  [root ...

  4. Python内置的字符串处理函数整理

    Python内置的字符串处理函数整理 作者: 字体:[增加 减小] 类型:转载 时间:2013-01-29我要评论 Python内置的字符串处理函数整理,收集常用的Python 内置的各种字符串处理 ...

  5. C&num;与数据库访问技术总结(十六)之 DataSet对象

    DataSet对象 DataSet对象可以用来存储从数据库查询到的数据结果,由于它在获得数据或更新数据后立即与数据库断开,所以程序员能用此高效地访问和操作数据库. 并且,由于DataSet对象具有离线 ...

  6. 通过GPS数据反向地理信息编码&comma; 得到当前位置信息

    检查可用性 这属于基础知识, 不赘述, 总的来说,你的设备的支持要打开, 添加CoreLocation的framework, 引用头文件, 添加委托,然后, 好的实践是在使用前编程检查相关可用性: - ...

  7. WordPress 主题开发 - &lpar;四&rpar; 创建WordPress的主题HTML结构 待翻译

    Now we're starting to get into the real meat of WordPress Theme development: coding the HTML structu ...

  8. long和Long的区别

    Java中数据类型分两种:1.基本类型:long,int,byte,float,double2.对象类型:Long,Integer,Byte,Float,Double其它一切java提供的,或者你自己 ...

  9. &lbrack;Javascript&rsqb; Use Number&lpar;&rpar; to convert to Number if possilbe

    Use map() and Number() to convert to number if possilbe or NaN. var str = ["1","1.23& ...

  10. Android使用HttpClient方法和易错问题

    HttpClient为Android开发人员提供了跟简洁的操作Http网络连接的方法,在连接过程中也有两种方式,get和post,先看一下怎样实现的 默认是get方式 //先将參数放入List,再对參 ...