C++异常之异常说明

分享一下我老师大神的人工智能教程!零基础,通俗易懂!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 stddouble divd(int a, int b) throw(int)  //异常说明,表示函数divd会抛出类型为int的异常{    if(b == 0throw 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

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序image组件中aspectFill和widthfix模式应用详解

aspectFill 与 widthfix 都是保持宽高比不变 aspectFill 保持纵横比缩放图片&#xff0c;只保证图片的短边能完全显示出来。也就是说&#xff0c;图片通常只在水平或垂直方向是完整的&#xff0c;另一个方向将会发生截取。 aspectFill同样保持图片的宽高比不会变形。但它让图片…

poj 2255 Tree Recovery 解题报告

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01;题目出处题意&#xff1a;输入两组数据&…

个人作业5——软件工程总结

一、请回望开学时的第一次作业&#xff0c;你对于软件工程课程的想象 对比开篇博客你对课程目标和期待&#xff0c;“希望通过实践锻炼&#xff0c;增强计算机专业的能力和就业竞争力”&#xff0c;对比目前的所学所练所得&#xff0c;在哪些方面达到了你的期待和目标&#xff…

SpringBoot在项目中基本配置设置

1、新增过滤器 &#xff08;1&#xff09;配置 WebFilter(filterName "corsFilter") public class CorsFilter extends OncePerRequestFilter {Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain ch…

C符号之逻辑运算符 左移与右移 自增自减

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01;本篇文章将总结C中一些比较有趣的符号逻辑运…

年轻的工程师如何月入伍万XD

郑昀&#xff1a;你要跟谁比&#xff1f;关键词&#xff1a;成长&#xff0c;自我管理&#xff0c;自我激励&#xff0c;面试&#xff0c;候选人201806 ——你觉得跟你的 Leader 差在什么地方&#xff1f;——肯定有差距&#xff0c;一个是知识面不如他广&#xff0c;二一个是解…

字符串翻转

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01;《递归入门》字符串翻转&#xff1a;将字符串…

Java学习之SpringBoot整合SSM Demo

背景&#xff1a;在Java Web中Spring家族有着很重要的地位&#xff0c;之前JAVA开发需要做很多的配置&#xff0c;一堆的配置文件和部署调试一直是JavaWeb开发中的一大诟病&#xff0c;但现在Spring推出了SpringBoot&#xff0c;提供了快速单机部署调试和注解配置的便利。作为一…

Java别说取余( )运算简单,你真的会吗

一&#xff0c;直击现场下面我来抛出几道题&#xff1a; 说明m是商&#xff0c;n是余数&#xff1b; &#xff08;1&#xff09;正数%正数 3%2m…….n 2%3m…….n (2)正数%负数或者负数%正数 -3%2m…….n 3%-2m…….n -2%3m…….n 2%-3m…….n (3)负数%负数 -3%-2m…….n -2%-3…

centos6 5从命令行进入图形界面

一&#xff0c;安装图形界面包组 yum groupinstall “Desktop” -y yum groupinstall “X Window System” -y之所以加 -y 是为了一会安装的时候不用再确认了。不加-y也行。不过一会儿有可能有很多选项需要你确认&#xff1b;二&#xff0c;进入图形界面 startx从图形界面到命令…

decimal这个数据类型的用法,保证你看懂

笔者在网上搜了好久&#xff0c;解释都晦涩难懂。最后通过亲手实践加课本知识得出结论如下&#xff1a; decimal(M,N) M表示:不包括小数点&#xff0c;不包括符号位&#xff0c;所能存数字的总位数&#xff08;包括小数部分和整数部分&#xff09; N表示&#xff1a;小数部分…

前端与后端接口的交互案例

一、案例描述1&#xff0c;前端页面提供用户名&#xff0c;密码输入框。 2&#xff0c;通过Ajax发送请求到后端Serlvet。 3&#xff0c;后端Serlvet处理请求&#xff0c;根据输入的用户名和密码返回给前端不同信息前端访问后端接口通过后端提供的的URL二、主要代码1、前端页面&…

20172301 2017-2018-2《程序设计与数据结构》课程总结

20172301 2017-2018-2《程序设计与数据结构》课程总结 每周作业链接汇总 预备作业1 简要内容:对上学期的认识和总结&#xff0c;对专业和老师的期望。预备作业2 简要内容:关于技能和学习技能经验。预备作业3 简要内容:安装虚拟机和Linux命令学习。第一周作业 简要内容: 计算机系…

软链接和硬链接到底有啥作用和区别

前言&#xff1a;在网上搜索了好久&#xff0c;看了很多博客&#xff0c;某度知道等等。关于软硬链接的解释都太模糊&#xff0c;还有什么i节点&#xff0c;跨分区根本弄不明白&#xff0c;在查阅了书籍和询问老师后决定自己写一篇简单的博文&#xff0c;然初学者都能够明白的博…

python执行gradle脚本

1 import os2 import shutil3 import subprocess4 5 #拷贝文件6 def copyFile(srcFile, dstFile):7 #检查源文件是否存在8 if not os.path.isfile(srcFile):9 print(%s not exist % srcFile) 10 return False 11 #如果目的路径不存在创建目录 12 …

redis 批量删除操作

redis 原生删除方法 del key1 key2 ... 只支持显示删除 使用*通配符 和 xargs可以很方便地进行批量删除 形式如下&#xff1a; redis-cli -h 192.168.1.45 -p 6379 keys "*" | xargs redis-cli -h 192.168.1.45 -p 6379 -n 6 del *通配符&#xff1a;匹配所有字符 补…

c语言怎么做到四舍五入

一&#xff0c;总结如下这里笔者就不谈Math.h中的round()函数了。它是可以做到的&#xff0c;但是据说这个函数和编译器有关系。所以在这里就不介绍了。 我的方法很简单&#xff1a;#include<stdio.h> int main(){ double d1,d2,d3; d1-3.1415926; d2(int)(d1*1…

c++ 的makefile文件实例

首先声明&#xff0c; 感谢九哥的帮助&#xff0c;因为从来没写过makefile&#xff0c; 所以一直是手动编译&#xff0c; 然后有一次写了三个文件&#xff0c; 需要编译&#xff0c; 而我只编译了一个文件&#xff0c; 所以一直出错&#xff0c; 九哥告诉我用makefile更方便&am…

操作系统短作业优先(SJF)调度算法

一&#xff0c;算法代码#include<stdio.h>struct sjf { //定义进程的结构体 char name[10];//进程名 float arrivetime;//到达时间 float servicetime;//服务时间 float starttime;//开始时间 float finishtime;//完成时间 float zztime; //周转时间 …

git add -A 、git add -u 、 git add . 三种区别

git add -A 提交所有变化 git add -u 提交被修改(modified)和被删除(deleted)文件&#xff0c;不包括新文件(new) git add . 提交新文件(new)和被修改(modified)文件&#xff0c;不包括被删除(deleted)文件 转载于:https://www.cnblogs.com/php08049/p/9214175.html