一,异常的推演

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. C# 关闭子线程的方法

    将子线程设定为IsBackGroud = true,程序关闭则自动死亡. 暴力手段:System.Environment.Exit(0).关闭时直接x掉所有线程. 子线程自行结束:子线程中自己判断.可 ...

  2. 2.3 LINQ查询表达式中 使用select子句 指定目标数据

    本篇讲解LINQ查询的三种形式: 查询对象 自定义查询对象某个属性 查询匿名类型结果 [1.查询结果返回集合元素] 在LINQ查询中,select子句和from子句都是必备子句.LINQ查询表达式必须 ...

  3. [翻译]初识SQL Server 2005 Reporting Services Part 2

    原文:[翻译]初识SQL Server 2005 Reporting Services Part 2 在Part 1文章中我们对SQL Server Reporting Services 2005(S ...

  4. linux下搭建SVN服务器完全手册-很强大!!!!!

    系统环境        RHEL5.4最小化安装(关iptables,关selinux) + ssh + yum 一,安装必须的软件包.        yum install subversion ( ...

  5. HPQC HP Quality Center windows 服务

    HPQC HP Quality Center windows 服务已经启动的话,就不用运行run.bat 两个是一样的效果.

  6. Android项目--获取系统通讯录列表

    ----------------- 通讯录列表 ----------------- 按常理来说,获取系统通讯录列表,无非就是将通讯录的数据库打开获取数据,适配,添加即可. Cursor cursor; ...

  7. 在线预览PDF

    FlexPaper+SWFTool+操作类=在线预览PDF   引言 由于客户有在线预览PDF格式的需求,在网上找了一下解决方案,觉得FlexPaper用起来还是挺方便的,flexpaper是将pdf ...

  8. iOS基础 - 数据存取

    一.iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档 SQLite3 Core Data 二.应用沙盒 每个iOS应 ...

  9. C#.Net获取Mac等PC信息

    using System.Management; using System.Net; public class PCInfoHelper { /// <summary> /// 操作系统的 ...

  10. wpf中xps文档合并功能实现

    跟着上一篇的xps文档套打的文章,近期一直在研究xps打印技术,其中用户提到了一个需求,要求能够多页面进行打印,我的想法是,先生成xps文件,然后将文件读取出来以后,合并成一个文件来处理. 如果要是直 ...