上节(c++:-8)主要学习了C++的流类库和输入输出,本节学习C++的异常处理。

异常处理

介绍

(1)异常处理的基本思想:



(2)异常处理的语法:



(3)举例:处理除0异常

#include <iostream>
using namespace std;
int divide(int x, int y) {
if (y == 0)
throw x; //抛出异常
return x / y;
}
int main() {
try {
cout << "5 / 2 = " << divide(5, 2) << endl;
cout << "8 / 0 = " << divide(8, 0) << endl;
cout << "7 / 1 = " << divide(7, 1) << endl;
} catch (int e) { //捕获异常
cout << e << " is divided by zero!" << endl;
}
cout << "That is ok." << endl;
return 0;
}
输出:
5 / 2 = 2
8 / 0 = 8 is divided by zero!
That is ok.

异常接口声明

  • 一个函数显式声明可能抛出的异常,有利于函数的调用者为异常处理做好准备
  • 可以在函数的声明中列出这个函数可能抛掷的所有异常类型,例如:
void fun() throw(A,B,C,D);
  • 若无异常接口声明,则此函数可以抛掷任何类型的异常。
  • 不抛掷任何类型异常的函数声明如下:
void fun() throw();

异常中的析构函数

异常发生时,是自动析构的:

(1)找到一个匹配的catch异常处理后

  • 初始化异常参数。
  • 将从对应的try块开始到异常被抛掷处之间构造(且尚未析构)的所有自动对象进行析构。

(2)从最后一个catch处理之后开始恢复执行。

下面给出例子:

(1)try块中子函数若抛出异常,则处理异常与局部对象析构的先后顺序是:先抛出异常,再析构子函数中的局部对象

(2)带析构语义的类的C++异常处理

#include <iostream>
#include <string>
using namespace std; class MyException {
public:
MyException(const string &message) : message(message) {}
~MyException() {}
const string &getMessage() const { return message; }
private:
string message;
}; class Demo {
public:
Demo() { cout << "Constructor of Demo" << endl; }
~Demo() { cout << "Destructor of Demo" << endl; }
};
void func() throw (MyException) {
Demo d;
cout << "Throw MyException in func()" << endl;
throw MyException("exception thrown by func()");
} int main() {
cout << "In main function" << endl;
try {
func();
} catch (MyException& e) {
cout << "Caught an exception: " << e.getMessage() << endl;
}
cout << "Resume the execution of main()" << endl;
return 0;
}
输出:
In main function
Constructor of Demo
Throw MyException in func()
Destructor of Demo
Caught an exception: exception thrown by func()
Resume the execution of main()

异常标准库

(1)标准异常类的继承关系:



(2)C++标准库各种异常类所代表的异常:



(3)标准异常类的基础

  • exception:标准程序库异常类的公共基类
  • logic_error表示可以在程序中被预先检测到的异常

    如果小心地编写程序,这类异常能够避免
  • runtime_error表示难以被预先检测的异常

    (4)举例:三角形面积计算

编写一个计算三角形面积的函数,函数的参数为三角形三边边长a、b、c,可以用Heron公式计算

#include <iostream>
#include <cmath>
#include <stdexcept>
using namespace std; //给出三角形三边长,计算三角形面积
double area(double a, double b, double c) throw (invalid_argument)//invalid_argument是异常类的对象
{
//判断三角形边长是否为正
if (a <= 0 || b <= 0 || c <= 0)
throw invalid_argument("the side length should be positive");//处理该异常完后就结束,下面不会执行了
//判断三边长是否满足三角不等式
if (a + b <= c || b + c <= a || c + a <= b)
throw invalid_argument("the side length should fit the triangle inequation");
//由Heron公式计算三角形面积
double s = (a + b + c) / 2;
return sqrt(s * (s - a) * (s - b) * (s - c));
}
int main() {
double a, b, c; //三角形三边长
cout << "Please input the side lengths of a triangle: ";
cin >> a >> b >> c;
try {
double s = area(a, b, c); //尝试计算三角形面积
cout << "Area: " << s << endl;
} catch (exception &e) {
cout << "Error: " << e.what() << endl;
}
return 0;
}

#include <iostream>
using namespace std; class CException
{
public:
CException() {}
virtual ~CException() {}
void Reason() {cout << "CException" << endl;}
};
void fn1()
{
throw CException();
}
int main()
{
try {
fn1();
} catch (CException& ce) {//捕获异常对象
ce.Reason();
}
return 0;
}

c++:-9的更多相关文章

  1. java web 开发三剑客 -------电子书

    Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知In ...

  2. 所有selenium相关的库

    通过爬虫 获取 官方文档库 如果想获取 相应的库 修改对应配置即可 代码如下 from urllib.parse import urljoin import requests from lxml im ...

  3. In-Memory:内存数据库

    在逝去的2016后半年,由于项目需要支持数据的快速更新和多用户的高并发负载,我试水SQL Server 2016的In-Memory OLTP,创建内存数据库实现项目的负载需求,现在项目接近尾声,系统 ...

  4. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  5. 【.net 深呼吸】细说CodeDom(8):分支与循环

    有人会问,为啥 CodeDom 不会生成 switch 语句,为啥没生成 while 语句之类.要注意,CodeDom只关心代码逻辑,而不是语法,语法是给写代码的人用的.如果用.net的“反编译”工具 ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  7. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  8. TODO:macOS编译PHP7.1

    TODO:macOS编译PHP7.1 本文主要介绍在macOS上编译PHP7.1,有兴趣的朋友可以去尝试一下. 1.下载PHP7.1源码,建议到PHP官网下载纯净到源码包php-7.1.0.tar.g ...

  9. In-Memory:在内存中创建临时表和表变量

    在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...

  10. In-Memory:内存优化表的事务处理

    内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...

随机推荐

  1. (Math.round(num*100)/100).toFixed(2); 将输入的数字变成保留两位小数

    <input type="number" @input="onInputPrice" @blur="onPrice" data-id= ...

  2. DOM 小总结

    DOM 是什么 文档对象模型,是针对 HTML 和 XML 文档的一个 API (应用程序编程接口), 描绘了一个层次化的节点树. D: document 当 web 浏览器浏览一个页面的时候,DOM ...

  3. jq easyui数据网络的分页过程

    第一次写技术方面的文章,有点忐忑,总怕自己讲的不对误导别人.但是万事总有个开头,有不足错误之处,请各位读者老爷指出. 言归正传,最近刚进新公司,上头要求我先熟悉熟悉easyui这个组件库.在涉及到da ...

  4. webstrom Debug 调试vue项目

    第一种,使用vue插件 下载插件:https://chrome.google.com/web... 这样直接run一个vue项目,你就会看见插件标亮了 打开调试模式,你就会看见最后有个vue标记,打开 ...

  5. MySQL优化篇系列文章(二)——MyISAM表锁与InnoDB锁问题

    我可以和面试官多聊几句吗?只是想... MySQL优化篇系列文章(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. 面试官:咦,小伙子,又来啦 ...

  6. PAT B1076 Wifi密码

    题目描述: 下面是微博上流传的一张照片:"各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1:B-2:C-3:D-4:请同 ...

  7. Java简单登录图形界面

    本文参考与:https://blog.csdn.net/wyf2017/article/details/78831744 https://blog.csdn.net/MengKun822/articl ...

  8. macos停止MySQL服务

    1.命令行中 使用 find /usr  -name mysql 查找自己电脑中MySQL的安装位置 例如我查找到我电脑MySQL安装位置是 /usr/local/Cellar/mysql@5.6/5 ...

  9. 为什么HashMap使用红黑树而不使用AVL树

    为什么HashMap使用红黑树而不使用AVL树? 红黑树适用于大量插入和删除:因为它是非严格的平衡树:只要从根节点到叶子节点的最长路径不超过最短路径的2倍,就不用进行平衡调节 AVL 树是严格的平衡树 ...

  10. Unity-动画状态机使用细节记录

    Unity动画控制器Animator功能非常强大,总结一些具体使用细节,在动作游戏中很实用: 1.动画烘焙 不同动画之间,可能存在角色朝向,重心高度不一致: 可以在动画Eidt界面设置RootTran ...