一,异常的推演

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++中的异常的更多相关文章

  1. PHP中Exception异常

    异常的基本使用 当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块. 如果异常没有被捕获,而且又没用使用 set_exception_hand ...

  2. 【Java心得总结二】浅谈Java中的异常

    作为一个面向对象编程的程序员对于 下面的一句一定非常熟悉: try { // 代码块 } catch(Exception e) { // 异常处理 } finally { // 清理工作 } 就是面向 ...

  3. python虚拟机中的异常流控制

    异常:对程序运行中的非正常情况进行抽象.并且提供相应的语法结构和语义元素,使得程序员能够通过这些语法结构和语义元素来方便地描述异常发生时的行为. 1.Python中的异常机制: 1.1Python虚拟 ...

  4. Python中获取异常(Exception)信息

    异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ...

  5. Java中测试异常的多种方式

    使用JUnit来测试Java代码中的异常有很多种方式,你知道几种? 给定这样一个class. Person.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  6. Atitit 数据处理查询 中的异常标准化草案 jpa jdbc hb  oql规范attilax总结

    Atitit 数据处理查询 中的异常标准化草案 jpa jdbc hb  oql规范attilax总结 Javaee6 与net 异常规范1 Jpa规范 JPA全称Java Persistence A ...

  7. 关于java中的异常问题 1

    1.首先参考一下关于java异常处理方面的知识 查看博客http://lavasoft.blog.51cto.com/62575/18920/ 这里介绍的很好,下面从中学习到一些东西,摘抄如下: 1. ...

  8. Java中的异常-Throwable-Error-Exception-RuntimeExcetpion-throw-throws-try catch

    今天在做一个将String转换为Integer的功能时,发现Integer.parseInte()会抛出异常NumberFormatException. 函数Integer.parseInt(Stri ...

  9. java中的异常和处理

    算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeAr ...

  10. jruby中的异常

    先看看ruby中的异常知识: 异常处理raise 例子: raise raise "you lose" raise SyntaxError.new("invalid sy ...

随机推荐

  1. 2014年辛星PHP教程秋季版第一本即基础知识已经完工

    因为本人还是蛮重视秋季版的,因此一開始就决定要把它做好,因此体系划分的比較具体,如今把它的第一本写作完成,在百度的下载点是:点我去百度 ,它的五十多个实例代码在百度的下载点是:点我下载源代码 ,当然, ...

  2. at System.Data.EntityClient.EntityConnection.GetFactory(String providerString)

    最近在做一个WinForm的项目. 使用vs2013开发. 数据库使用的是oracle. 在本地写了一个webservice .测试正常.发布到服务器的时候.就是提示了错误. 打开服务器上的日志.看到 ...

  3. Android学习路径——Android的四个组成部分activity(一)

    一.什么是Activity? Activity简单的说就是一个接口.我们是Android手机上看到的每个界面就是一个activity. 二.Activity的创建 1.定义一个类继承activity, ...

  4. Windows Azure

    Windows Azure初体验 目前在IT界,云这个概念的第一意思不再是词典里的解释了.不过它们还是有相同点的——也许确实会酝酿出一块大蛋糕,可也是飘在天上,众神分食之,与我等P民无关.所谓云,不过 ...

  5. Android 获取截图 并将其保存到本地sd在卡路径

    /** * 获取当前屏幕和保存截图 */ private void GetandSaveCurrentImage() { //1.构建Bitmap WindowManager windowManage ...

  6. 数据结构队列的java实现,包括线性和链式两种方式

    实现的思路为: 采用泛型的方式,首先定义了一个Queue的接口,然后通过实现该接口实现了线性和链式的两种形式的队列: 接口代码如下: package com.peter.java.dsa.interf ...

  7. 使用POI 导入excel

    引言:最近一直在接触excel的问题,网页也有很多关于POI解析excel的资料,我也简单的整理了下,有不对地方的还望及时指正,渴望与大家交流并学习. public int importExcel(F ...

  8. DOM事件简介

    DOM事件简介--摘自ADMIN10000 Posted on 2013-12-05 09:32 ziran 阅读(76) 评论(1) 编辑 收藏 Click.touch.load.drag.chan ...

  9. 【IOS开发】基础

    1.Objective-C 为 ANSI C 添加了下述语法和功能: 定义新的类 类和实例方法 方法调用(称为发消息) 属性声明(以及通过它们自动合成存取方法) 静态和动态类型化 块 (block), ...

  10. c#实现Google账号登入授权(OAuth 2.0)并获取个人信息

    c#实现Google账号登入授权(OAuth 2.0)并获取个人信息   此博主要介绍通过google 账号(gmail)实现登入,授权方式OAuth2.0,下面我们开始介绍. 1.去google官网 ...