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 啰嗦有时会掩盖主题:这本书确实有些啰嗦,比如在讲函数重载的时候,讲了太长一大段(有两节是打了*号的,看还是不看 ...
随机推荐
- log4j.properties的配置与详细说明
1. 新建测试项目testLog,并引入jar包. 2. 在src目录下新建log4j.properties文件,然后开始配置文件. log4j.rootLogger=INFO,stdout,debu ...
- 修改Linux内核参数,减少TCP连接中的TIME-WAIT
一台服务器CPU和内存资源额定有限的情况下,如何提高服务器的性能是作为系统运维的重要工作.要提高Linux系统下的负载能力,当网站发展起来之后,web连接数过多的问题就会日益明显.在节省成本的情况下, ...
- js本地图片预览,兼容ie[6-9]、火狐、Chrome17+、Opera11+、Maxthon3
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 批量改名的多种方法stu_3_finished.jpg 去掉finished,stu_{1..20}_finished.jpg
方法一:rename修改文件名 rename "finished" "" *.jpg [root@ob1 scripts]# rename "fini ...
- 上手并过渡到PHP7(2)——必须传递int, string, bool参数?没问题
Type hints, Type safe 泊学实操视频 泊学原文链接PHP 7中最引人注目的新特性之一,无疑是Scalar type hints.我们可以在函数参数和返回值中使用scalar typ ...
- tensorflow函数学习笔记
https://www.w3cschool.cn/tensorflow_python/tensorflow_python-4isv2ez3.html tf.trainable_variables返回的 ...
- 【转】7Z命令行解压缩
7z.exe在CMD窗口的使用说明如下: 7-Zip (A) 4.57 Copyright (c) 1999-2007 Igor Pavlov 2007-12-06 Usage: 7za <co ...
- 您可以从 Windows 命令行上运行 gcc、g++、ar、ranlib、dlltool 和其他一些 GNU 工具
Windows 上的安装为了在 Windows 上安装 GCC,您需要安装 MinGW.为了安装 MinGW,请访问 MinGW 的主页 www.mingw.org,进入 MinGW 下载页面,下载最 ...
- C#获取并修改文件扩展名的方法
本文实例讲述了C#获取并修改文件扩展名的方法.分享给大家供大家参考.具体分析如下: 这里使用C#编程的方法改变文件扩展名的文件,必须使用Path类. Path类用来解析文件系统路径的各个部分.静态方法 ...
- php多语言截取字符串函数
<?php header("Content-Type:text/html;charset=utf-8"); function msubstr($str, $start = 0 ...