分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

为了能够编写适当的catch子句,了解一个函数是否抛出异常或会抛出哪些异常对函数的用户来说是很有帮助的。

而我们可以通过 异常说明 进行对一个函数的异常进行说明, 如果函数抛出异常,被抛出的异常将是包含在该说明中的一种或是从列出的异常中派生的类型。

异常说明有如下的几种形式:

1. 指定异常

T   funNname( parameterlist ) throw( T1, T2,····,Tn)

其中 T 是类型, parameterlist 是参数列表, 而类型 T1, T2,····,Tn 是函数会抛出的异常。

2. 不抛出异常

T   funNname( parameterlist ) throw( )

抛出异常类型列表为空,表示的是该函数不抛出任何类型异常。

3. 抛出任意类型的异常

T   funNname( parameterlist );

这表示该函数可以抛出任意类型的异常。

下面通过一段简单的代码来说明异常说明的特别之处

#include <iostream>class demo{};using namespace std; double divd(int a, int b) throw(int)  //异常说明,表示函数divd会抛出类型为int的异常{    if(b == 0)  throw demo();         //抛出类型为demo的异常         return    a/b;}int main(){    try    {        divd(1,0);    }    catch(demo)                       //捕获异常类型demo    {        cout << " divided by zero " << endl;    }    catch(int)                        //捕获异常类型int    {        cout<<"zero"<<endl;    }        return 0;}

这段代码的运行结果是输出:  divided by zero

奇怪了,在 divd 函数的声明中,只说明了抛出类型为 int 的异常,为什么其函数内抛出的异常类型却为demo呢? 

我们可以暂时理解为:在某函数的异常说明中的列出的类型与该函数内抛出的异常类型不完全匹配时, 但在异常处理代码中的catch有对其类型的捕获, 所以程序运行正常。

好,下面我们根据异常说明进行一些修改

double divd(int a, int b) throw( )     //将throw(int) 改为 throw( )

修改之后,编译运行,看到的输出结果还是:   divided by zero

根据上面对异常说明的三种形式介绍,我们知道在函数声明后面添加 throw()的意思是说明了此函数不会抛出任何的异常。那为什么这里抛出了而且又被捕获呢?

其实,在编译的时候,编译器不能也不会试图验证异常说明。因不能在编译时检查异常说明,异常说明的应用通常是有限的!

修改后的 divd 函数内继续编写有抛出异常的代码, 编译后再次运行程序,其输出结果也表示异常机制执行正常。
其原因就如上述所说的理解那样:编译器不会对异常说明进行检测,异常说明更多的是写给函数的用户看。
而在一开始函数异常说明的类型与实际抛出的异常类型不匹配的情况中,同样由于 “编译器不会对异常说明进行检测” 的原因,所以编译通过,异常机制运行正常。
总结:异常说明还是有用的!但更多是写给函数用户看的。让函数用户清楚知道抛出的异常类型,从而更好和正确地在运用此函数时,编写对其的异常检测。
由于初学者在学语法的时候,更多的只是看书,不进行实践验证。就算实践验证了,也可能只是照书上代码敲,看看运行结果是否一样。这里给出一个建议:初学者在学习语法的时候,应该多上机实践验证书上语法的准确性,就算运行结果与书上一致,也应该多动脑筋,对其进行变形或改动。这样往往能学到的东西和印象都会更深的!

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

C++异常之异常说明相关推荐

  1. 简单介绍Go语言错误处理异常捕获+异常抛出

    这篇文章主要介绍了Go语言错误处理异常捕获和异常抛出,Go语言的作者认为java等语言的错误处理底层实现较为复杂,就实现了函数可以返回错误类型以及简单的异常捕获,虽然简单但是也非常精妙,大大的提高了运 ...

  2. Java异常之异常机制

    2019独角兽企业重金招聘Python工程师标准>>> Java异常处理机制依赖5个关键字try,catch,finally,throw,throws.try关键字后跟着可能出现异常 ...

  3. python循环捕捉异常_python异常捕捉以及处理

    看标题觉得高大上,好像能处理所有的异常.但是,事实是只能按照字面的意思来理解这一段话. 众所周知写代码哪有不出bug的? 那么出现了bug 我们不想让程序因为bug的存在而退出.那么要怎么做呢? 今天 ...

  4. java怎么捕捉除数异常_Java异常的捕获及处理---小总结

    一:异常的基本概念 二:异常的基本处理格式 三:异常的继承结构 四:Java的异常处理机制 五:throws和throw关键字的作用 六:Exception和RunntimeException的区别 ...

  5. C++ 面向对象(三)异常 :异常概念、异常的匹配规则、异常安全、异常体系

    目录 C语言传统的错误处理方法 异常的概念 异常的匹配规则 异常安全 异常规范 异常体系 C++标准库的异常体系 自定义异常体系 C语言传统的错误处理方法 在C语言中,因为没有异常这个机制,所以出现错 ...

  6. 多态的概念、对象上下转型、多态的应用、异常(异常概念、异常分类、java异常处理机制、try...catch...finally、throw和throws、自定义异常)

    多态的概念: 多态性是指同一个操作作用于某一类对象,可以有不同的解释,产生不同的执行结果. 多态存在的三个必要条件: ① 需要存在继承或实现关系 ② 同样的方法调用而执行不同的操作.运行不同代码(重写 ...

  7. 软件测试抛出异常,异常测试之异常注入初探

    背 景 常规的功能测试,主要关注业务的正常逻辑是否能够走通,往往忽视了各种异常对服务造成影响,因此需要提高异常测试的关注度.异常测试包括很多方面,有服务器系统异常.依赖服务异常.应用本身异常等. 服务 ...

  8. assertionerror是什么异常_php7异常与错误处理和自定义异常

    7.2版本异常与错误的概述 什么叫做异常? 异常是指程序运行中不符合预期情况以及与正常流程不同的状况. 比如你链接数据库,在参数都写上去的条件下,发现链接不上去,这就属于不符合预期. 可以被 try- ...

  9. Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法

    Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法 参考文章: (1)Java并发--ConcurrentModificationExce ...

  10. java 到异常_java编程中遇到的异常以及异常的一些处理

    n 异常的概念 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户? 比如除法运算.读写文件操作,都可能 ...

最新文章

  1. java方法区内存泄露_深入理解java虚拟机-第二章:java内存区域与内存泄露异常...
  2. boost::range_const_iterato相关的测试程序
  3. SpringMVC的请求-文件上传-单文件上传的代码实现2
  4. 2014年工作中遇到的20个问题:120-140
  5. 许家印帮贾跃亭广州拿地造车,这是要翻身的节奏吗?
  6. 那些神一样的学习技巧,专治各种不服!
  7. Django之form表单组件、cookie与session
  8. Linux TCP 性能調優筆記
  9. ArcGIS服务器的feature图层限制
  10. 瑞友虚拟化系统搭建服务器,瑞友云电脑虚拟化系统 | 瑞友天翼-应用虚拟化|远程接入|桌面虚拟化|国内虚拟化整体解决方案领导者...
  11. android应用上架到各大应用市场总结
  12. 2018年华为网络技术大赛总结
  13. Unity遮罩简单复刻2D平台《Unbound: Worlds Apart》游离于世界之海的双重世界效果
  14. SCI、EI和IEEE有什么区别
  15. 计算机基础知识考什么,我想请问下,计算机初级考试考些什么东西?
  16. libsvmpredict和svmtrain的参数和返回值
  17. 公路多孔箱涵设计_双孔8x3.3米钢筋混凝土箱涵设计套图(19张)
  18. 机器学习-特征归一化
  19. MYSQL修改数据库密码
  20. 腾讯2021暑期C++天美工作室游戏开发实习面试题面经

热门文章

  1. datagridview绑定与详细说明 (搜集)
  2. 【原创】简单轻松浏览FTP
  3. DBeaver连接达梦|虚谷|人大金仓等国产数据库
  4. RabbitMQ六种队列模式-工作队列模式
  5. Android 生成随机数,获取一条随机字符串
  6. ViewPager外部获取“当前显示的页面的位置position”
  7. coding ssh_exchange_identification: Connection closed by remote host
  8. lodash 根据某个字段排序处理
  9. rman全备时,配置项如何设置?
  10. linux6.8安装图形桌面,图形/文本界面安装CentOS 6.8系统详解