【C++基础】异常处理机制概要

目录

    • C++的异常处理方法知识要点
    • 踹扔抓的代码块示例
    • 两种处理被0除的方法
    • 异常处理机制的优点
    • 其他语言中的异常处理
    • C++函数异常声明

C++的异常处理方法知识要点

理解“踹扔抓”三部曲的结构,尤其是catch是怎么匹配异常的。

知道C++标准库中的异常类都是从exception继承下来的,并且支持 what() 这个操作

了解logic_error、runtime_error等一些常见的异常类的大致含义,以便于我们自己写异常类的时候拿来继承

理解多个catch语句的匹配原则,尤其是对于继承链上的异常类型,哪个在前哪个在后必须做到心里有数

掌握异常传播的原理:异常如果在当前函数中没有被捕获,它就会被抛向当前函数的调用者;抛异常的语句后面的语句都会被跳过,直到遇到对应的catch

踹扔抓的代码块示例

try{code to try;throw an exception (1)with a throw statement(2) or from functionMore code to try;
}
catch(type e){Code to process the exception;
}

两种处理被0除的方法

(1) use if statement (使用if语句)
(2) use exception handling (使用异常处理)

下面是使用异常处理的程序,如果除数是0,那么会抛出number1;执行throw语句之后, 紧随其后的 cout 语句就会被跳过;
如果能够抓住number1,那么就会进行处理,不会出现程序出错。
如果type不匹配,就会抓不住,程序会崩溃。

int main() {// Read two intergerscout << "Enter two integers: ";int number1, number2;cin >> number1 >> number2;try {if (number2 == 0)throw number1;cout << number1 << " / " << number2 <<" is "  << (number1 / number2) << endl;}catch (int e) {cout << "Exception: an integer " << e <<" cannot be divided by zero" << endl;}cout << "Execution continues ..." << endl;
}

异常处理机制的优点

可将异常信息从被调函数带回给主调函数。异常处理实际上是对程序执行流程的控制

如下例:在quotient里面遇到异常,将异常扔出而不对异常进行处理,问题交由主调函数main来处理。从而将异常的发现与处理分开。

//用异常处理
int quotient(int number1, int number2) {if (number2 == 0) throw number1; return number1 / number2;
} 
int main() {try {int x = quotient(1, 0);} catch (int) {std::cout << "除数为0!";}
}

若不用异常处理:quotient()如何告诉 main() “number2 有问题”?
我们可以从返回值和传引用的角度思考,但是若是函数嵌套调用,该如何将异常信息带回给主调函数

(1) 用返回值?
·f(number2 == 0) return x; //x应该是0还是1?
(2) 用指针/引用类型的参数?然后再主函数去查看这个参数,但是不优雅。
int quotient(int n1, int n2, int &s){ if(n2 == 0) s=-1; //求商,函数要3个参数? }
(3) 如果采用 f(g(h(quotient(x,y))));怎样将错误从quotient() 传到 f()?若是使用(2),难道要在每个函数加上一个引用类型的参数来让主调函数查询是否出现异常吗?
显然,在这种情况下用异常处理更加简洁

其他语言中的异常处理

python中:

try:代码raise xxx抛出异常
except:错误时执行
else:没有错误时执行
finally无论如何都执行 

关于java与C++:
在C++中,你可以抛出任何类型的异常。(c++可以抛出任何类型,,java中这样是不行的).
Java的函数异常声明是在编译时刻检查的,所以如果是java任何调用abc函数的其他函数,java虚拟机会强迫那些调用abc函数的其他函数处理matherr, error这些异常。
而C++编译在时候,对这些调用 以声明会抛出异常函数 的其他函数,不会强制他们处理这些可能会抛出的异常。

C++函数异常声明

1、在函数参数列表后声明可能会抛出的异常:
C++从某个年代就开始,在函数的后面加上“:”+ throw+“()”,圆括号内有1个或多个异常类,多个用逗号分割。
void abc( int a ) : throw ( matherr, error) {…}
这是告诉别的程序,在abc函数的运行时刻,最多可以抛出圆括号里的哪些个异常类。
2、函数后声明可能抛出的异常 的 意思:
当前函数运行时刻有可能会抛出的异常,但是保证不会抛出圆括号内matherr, error以外的其他异常。

C++函数异常声明,不是用来约束那些调用声明可能会抛出异常abc函数 的其他函数。不是约束其他函数 调用abc 就必须处理matherr, error这些异常。而是用来约束abc函数本身的行为。abc 函数声明会抛出matherr, error这些异常,如果abc函数运行时抛出了除了matherr, error以外的异常,程序会抛出unexpected(想不到/未知的)异常然后程序终止。
·C++函数后声明/不声明异常:

·1、void abc( int a ) {…} //普通函数

普通函数表示可以抛出任何异常

·2、void abc( int a ):throw() {…} // 不抛异常的函数

函数参数后 throw(),圆括号内没有任何东西,表示这个函数承诺不会抛出任何异常!

·3、void abc( int a ):throw(matherr) {…} //函数会抛出matherr

函数参数后 throw(),圆括号有matherr,表示运行时会有一个机制检验这个函数是否真的,只抛出了列表里的matherr异常。

·区别与Java函数后声明/不声明异常:

·1、void abc( int a ) {…} //普通函数

普通函数表示不抛出任何异常

·2、void abc( int a ) throw(exception) {…} // 抛出任何异常 函数参数后
throw(),圆括号内有exception,表示这个函数会抛出任何异常!

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

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

相关文章

[转载]Struts2 获得Session和Request

转自http://www.blogjava.net/lyyb2001/archive/2008/03/07/184593.html 在struts1中&#xff0c;获得到系统的request或者session对象非常方便&#xff0c;都是按照形参传递的&#xff0c;但是在struts2中&#xff0c;request和session都被隐藏了struts提供两种方式访问sessio…

WPS根据章节编号依次排序

第Ⅲ章节有四小部分&#xff0c;分别为A、B、C、D 第Ⅳ章节要重新开始编号&#xff0c;从A开始 操作步骤&#xff1a; ①再D后面回车&#xff08;红线位置回车&#xff09;&#xff0c;生成E ②把Ⅳ中待写内容写到E中 ③将E复制到Ⅳ下&#xff0c;这里需要注意D的换行也要复制…

【C++基础】异常匹配与内建异常类

目录异常匹配catch: 按异常类型匹配为何要使用异常类内建异常类标准库中的异常基类标准库中的异常类例1&#xff1a;vector下标访问越界out_of_range异常例2&#xff1a;内存分配失败bad_alloc异常例3&#xff1a;侧向转换失败bad_cast异常类几种情况&#xff0c;使用对应异常异…

scala 访问修饰符_Scala中的访问修饰符

scala 访问修饰符Access modifiers are used in order to restrict the usage of a member function to a class or a package. Using access modifiers data hiding takes place which is a very important concept of OOPs. 访问修饰符用于将成员函数的使用限制为类或包。 使…

小试---EF5.0入门实例1

现在做个小练习吧~~~ 第一步&#xff1a;首先新建一个数据库名字为Test;数据库里面只有一个表UserTable 脚本为&#xff1a; USE [master] GO /****** 对象: Database [Test] 脚本日期: 12/15/2013 18:51:54 ******/ CREATE DATABASE [Test] ON PRIMARY ( NAME NTest, F…

iScroll4 禁止select等页面元素默认事件的解决方法 转

iScroll4 禁止select等页面元素默认事件的解决方法起因在于onBeforeScrollStart : function(e){ e.preventDefault(); },这一行&#xff0c;iSroll禁止了事件的默认行为&#xff0c;导致select&#xff0c;option&#xff0c;textarea等元素无法点击。解决方法也很简单&#xf…

C++中比较两个浮点数是否相等

来源&#xff1a; https://stackoverflow.com/a/37686/3242645 代码&#xff1a; #include <cmath> #include <limits> bool AreSame(double a, double b) {return std::fabs(a - b) < std::numeric_limits<double>::epsilon(); }

MPEG的完整形式是什么?

MPEG&#xff1a;运动图像专家组 (MPEG: Moving Picture Experts Group) MPEG is an abbreviation of Moving Picture Experts Group. It is a working group of authorities that is founded to establish standards for audio and video compression and transmission. The a…

正则 去除html标记

//string regexstr "<[^>]*>"; //去除所有的标签 //"<script[^>]*?>.*?</script>" //去除所有脚本&#xff0c;中间部分也删除 // string regexstr "<img[^>]*>"; //去除图片的正则 // string regexstr &…

自画PopMenu弹出

BorderColor:TColor; //边框颜色FillColor:TColor; //未选中填充颜色TextColor:TColor; //未选中字体颜色SelectTextColor:TColor; //选中字体颜色SelectFillColor:TColor; //选中填充颜色SideBuffer:Integer; //边框宽度procedure TForm1.FormCreate(Sender: TObject); b…

安利一款倒计时插件---雨滴桌面

内容来自B站(搜索Rainmeter即可)&#xff0c;里面教程很多&#xff0c;因为视频看的有点麻烦&#xff0c;故进行了整理 一、下载安装包、解压、安装 免费下载连接&#xff0c;不需要积分 skin文件夹存放皮肤的一些配置文件&#xff0c;因为原本皮肤太low了 第二个是可执行文…

【C++基础】自定义异常类与多重捕获

目录自定义异常类构建过程例&#xff1a;Vec3D类的数组下标越界的异常类捕获多种无关异常不同的异常的捕获捕获派生异常异常处理的次序例子&#xff1a;多重捕获异常类catch块的参数类型可以不用引用类型吗?自定义异常类 自定义异常类通常由exception或其后代类派生。这样我们…

gprs 睡眠模式_GPRS的完整形式是什么?

gprs 睡眠模式GPRS&#xff1a;通用分组无线业务 (GPRS: General Packet Radio Service) GPRS is an abbreviation of General Packet Radio Service. It is a non-voice, high-level speed packet switching technology planned for GSM networks. On 2G and 3G cellular tran…

int main(int argc,char* argv[])讲解

分类&#xff1a; 学习笔记2011-11-07 21:502354人阅读评论(0)收藏举报dos编译器pathunixcommandc在最近学习中老是遇到 int main(int argc,char* argv[])&#xff0c;以为就是简单的参数应用了&#xff0c;但是看代码是没能理解参数的具体传递过程&#xff0c;上网…

Maven实战(七)——常用Maven插件介绍(上)

我们都知道Maven本质上是一个插件框架&#xff0c;它的核心并不执行任何具体的构建任务&#xff0c;所有这些任务都交给插件来完成&#xff0c;例如编译源代码是由maven-compiler-plugin完成的。进一步说&#xff0c;每个任务对应了一个插件目标&#xff08;goal&#xff09;&a…

【设计模式之美】<Reading Notes>抽象类与接口

抽象类特性 1、抽象类不允许被实例化&#xff0c;只能被继承。 2、抽象类可以包含属性和方法。方法既可以包含代码实现&#xff0c;也可以不包含代码实现。不包含代码实现的方法叫做抽象方法。 3、子类继承抽象类&#xff0c;必须实现抽象类中的所有抽象方法。 接口特性 1、…

多线程之间共享数据的实现

1&#xff1a;如果每个线程执行的代码相同&#xff0c;可以使用同一个Runnable对象&#xff0c;然后将共享的数据放在Runnable里面&#xff0c;来实现数据的共享。 例如买票系统... package com.cn.gbx;import java.util.Date; import java.util.Random; import java.util.Time…

AIX的完整形式是什么?

AIX&#xff1a;高级交互式主管 (AIX: Advanced Interactive Executive) AIX is an abbreviation of "Advanced Interactive Executive". AIX是“ Advanced Interactive Executive”的缩写 。 It is a progression sequence of proprietary UNIX operating systems …

c#生成随机字符串 用做批量申请账号时的随机密码还是相当不错的

//随机字符串生成器的主要功能如下&#xff1a; //1、支持自定义字符串长度 //2、支持自定义是否包含数字 //3、支持自定义是否包含小写字母 //4、支持自定义是否包含大写字母 //5、支持自定义是否包含特殊符号 //6、支持自定义字符…

【C++基础】C++11的noexcept声明符 与 异常传播

目录C noexcept&#xff1a;1、用途2、用法1、noexcept声明符的用法&#xff1a;2、noexcept运算符的用法异常传播1、异常传播的定义2、异常传播中的规则3、异常传播的代价C noexcept&#xff1a; 1、用途 C11使用noexcept指明函数是否抛出异常&#xff1a; 若函数不抛异常&a…