C++中的异常
一,异常的推演
1.函数与异常
平时我们在函数中出现异常情况时通常通过return终止函数并返回一个值,然后在函数上层来获取值并判断是什么异常情况。因为函数是栈结构的,所以return的时候是通过栈结构逐步往上的,不能够跨函数直接抛出,不方便。所以C++推出了异常机制,通过异常机制我们可以轻松的捕获要出现的异常。
2.C++中异常的基本演示
# include<iostream>
using namespace std; /* 定义求商函数,如果除数为0,抛出double类型异常 */
double div(double d1, double d2)
{
if (d2 == )
{
throw d2;
}
return d1 / d2;
} int main()
{
/* try...catch语句来捕获异常 */
try
{
double result = div(1.02, 0.0);
}
catch (double e)
{
/* C++中的异常严格要求类型匹配,即抛出什么的异常就catch什么类型的异常 */
cout << e << "不能作除数" << endl;
}
catch (...)
{
cout << "未知异常" << endl;
} return ;
}
3.C++中异常的总结
- 异常的捕捉严格匹配数据类型,不支持类型自动转换,throw的是int类型则catch的必须是int类型否则不会匹配。
- 一般我们在异常最后加入catch(...)这样能够捕获任意异常。
二,自定义异常类
1.异常类
按照面向对象的思维,我们的异常也应该是一个对象,所以在抛出异常的时候,我们通常自定义一个异常类,然后把异常信息放入异常类中,然后在捕捉到异常对象的时候,再调用对象的方法,打印出异常的信息。
2.异常类代码演示
# define _CRT_SECURE_NO_WARNINGS
# include<iostream>
using namespace std; /* 自定义异常类 */
class MyException
{
private:
char * content;
public:
/* 异常类构造函数 */
MyException(const char * content)
{
this->content = new char[strlen(content) + ];
strcpy(this->content, content);
cout << "异常类有参构造函数执行" << endl;
}
/* 异常类拷贝构造函数 */
MyException(const MyException& me)
{
this->content = new char[strlen(me.content) + ];
strcpy(this->content, me.content);
cout << "异常类拷贝构造函数执行" << endl;
}
/* 异常类析构函数 */
~MyException()
{
if (this->content != NULL)
{
delete[] this->content;
this->content = NULL;
}
cout << "异常类的析构函数执行" << endl;
}
/* 异常类抛出异常信息 */
void toString()
{
cout << this->content << endl;
}
}; /* 定义测试异常的函数 */
double divide(double d1, double d2)
{
if (d2 == )
{
throw MyException("除数不能为0");
//throw new MyException("除数不能为0");
}
return d1 / d2;
} int main()
{
try
{
double result = divide(, );
cout << "result = " << result << endl;
}
catch (MyException e)
{
// catch的异常是元素类型,执行的是拷贝构造函数,存在两个异常对象,释放两个异常对象,不合理
e.toString();
}
catch (MyException * e)
{
// catch的异常是指针类型,必须我们手动调用delete方法才能调用析构函数,不合理
e->toString();
delete e;
}
catch (MyException& e)
{
// catch的是引用类型,是原先抛出的对象,会自动执行析构函数,我们使用引用来接收抛出的异常对象
e.toString();
}
catch (...)
{
cout << "未知异常" << endl;
} return ;
}
3.自定义异常类总结
- 抛出异常对象通常用引用的方式来catch这个对象,如果是元素catch异常对象则会执行拷贝构造函数,创建两个重复异常对象并释放两次对象,所以说不合理。如果catch的是指针类型,不会自动调用该对象的析构函数必须我们手动delete,也不符合自动调用的逻辑,所以使用引用的方式来catch异常对象。
三,标准异常类
1.标准异常类
C++中提供了标准的异常类,需要# include<exception>,标准异常类为exception,该类有个what函数,可以打印异常对象的异常信息。该what函数是虚函数,我们需要继承exception类并重写该what函数,在捕捉异常的时候,我们用父类的引用来接收自定义的标准异常类的子类对象(类型兼容性原则),然后打印该异常信息即可。
2.标准异常类演示
# include<iostream>
# include<exception>
using namespace std; /* 继承自标准异常类 */
class DivException :public exception
{
private:
const char * ptr;
public:
/* 构造函数接收异常信息 */
DivException(const char * ptr)
{
this->ptr = ptr;
}
/* 重写what函数 */
virtual char const * what() const
{
cout << this->ptr << endl;
return ptr;
}
};
/* 测试异常函数 */
int divi(int a, int b)
{
if (b == )
{
throw DivException("除数不能为0");
}
return a / b;
} int main()
{
try
{
divi(, );
}
catch (exception& e)
{
/* 使用exception引用接收自定义的子类对象 */
e.what();
}
catch (...)
{
cout << "未知异常" << endl;
} return ;
}
C++中的异常的更多相关文章
- PHP中Exception异常
异常的基本使用 当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块. 如果异常没有被捕获,而且又没用使用 set_exception_hand ...
- 【Java心得总结二】浅谈Java中的异常
作为一个面向对象编程的程序员对于 下面的一句一定非常熟悉: try { // 代码块 } catch(Exception e) { // 异常处理 } finally { // 清理工作 } 就是面向 ...
- python虚拟机中的异常流控制
异常:对程序运行中的非正常情况进行抽象.并且提供相应的语法结构和语义元素,使得程序员能够通过这些语法结构和语义元素来方便地描述异常发生时的行为. 1.Python中的异常机制: 1.1Python虚拟 ...
- Python中获取异常(Exception)信息
异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ...
- Java中测试异常的多种方式
使用JUnit来测试Java代码中的异常有很多种方式,你知道几种? 给定这样一个class. Person.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- Atitit 数据处理查询 中的异常标准化草案 jpa jdbc hb oql规范attilax总结
Atitit 数据处理查询 中的异常标准化草案 jpa jdbc hb oql规范attilax总结 Javaee6 与net 异常规范1 Jpa规范 JPA全称Java Persistence A ...
- 关于java中的异常问题 1
1.首先参考一下关于java异常处理方面的知识 查看博客http://lavasoft.blog.51cto.com/62575/18920/ 这里介绍的很好,下面从中学习到一些东西,摘抄如下: 1. ...
- Java中的异常-Throwable-Error-Exception-RuntimeExcetpion-throw-throws-try catch
今天在做一个将String转换为Integer的功能时,发现Integer.parseInte()会抛出异常NumberFormatException. 函数Integer.parseInt(Stri ...
- java中的异常和处理
算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeAr ...
- jruby中的异常
先看看ruby中的异常知识: 异常处理raise 例子: raise raise "you lose" raise SyntaxError.new("invalid sy ...
随机推荐
- APUE学习笔记(2):lseek()练习与文件洞
对于lseek函数早在大一的C语言课上就有接触,但是几乎没有使用过,只记得是和文件偏移操作相关的 看了APUE上的示例,又使用od工具查看了内容,果然很神奇,很新鲜 figure3.2.c [c] # ...
- 在OpenWrt上编写自己的硬件操作程序
上一篇文章中有写到如何使用OPENWRT的SDK,这里继续,写怎么在上面开发自己的应用程序. 我欲在OpenWrt上编写一个软件,它能够去读取某个AD芯片的多通道采样值. 在看这篇文章之前请看这官方的 ...
- 淘宝code
淘宝code 相信大家都听说过GitHub,也有很多人在用,但是GitHub毕竟在国外,速度不是很给力,而且安装过程也是很漫长.今天来给大家介绍一个国内的免费的开源项目平台,当然也是一个SVN版本控制 ...
- Your build host version of Xamarin.IOS (release NO.)is too recent to work with the IOS designer
Encounted such error in VS after I update the xamarin at Mac side.Here is the solution for u to refe ...
- 【WebSocket初探
】
众所周知,socket是编写网络通信应用的基本技术,网络数据交换大多直接或间接通过socket进行.对于直接使用socket的client与服务端,一旦连接被建立则均可主动向对方传送数据,而对于使用更 ...
- PHP中使用Ajax
在PHP中使用Ajax来获取数据库中的数据,从而达到不刷新页面就可以获取. 首先在JS中定义变量如: var xmlHttp;function getXmlHttp(){ if(window.Acti ...
- beanutils中类型转换
public void doPost(HttpServletRequest request, HttpServletResponse response) throws Servl ...
- 仿async/await(一)and Gulp:新一代前端构建利器
NET 4.5的async/await真是个神奇的东西,巧妙异常以致我不禁对其实现充满好奇,但一直难以窥探其门径.不意间读了此篇强文<Asynchronous Programming in C# ...
- 定制你自己的jQuery
如何定制你自己的jQuery jQuery随着版本的不断升级代码量也随之增加,从1.0.0的不到两千行到现在的1.10.2已经突破1万行. 新的API不断增加,但有些在项目中并没有用到.jQuery团 ...
- Linux下监控磁盘空间的四个命令
无论是运行简单的Linux桌面还是大型Linux服务器,都需要了解可供应用程序使用的空间,并跟踪系统的磁盘使用情况.下面介绍四个核心命令行命令来管理Linux系统上的介质环境. 一.mount命令 m ...