C++ throw:抛出自己的异常

throw 是C++中的关键字,用来抛出异常。如果不使用 throw 关键字,try 就什么也捕获不到;上节提到的 at() 函数在内部也使用了 throw 关键字来抛出异常。

throw 既可以用在标准库中,也可以用在自定义的函数中,抛出我们期望的异常。throw 关键字语法为:

throw exceptionData;

exceptionData 是“异常数据”的意思,它既可以是一个普通变量,也可以是一个对象,只要能在 catch 中匹配就可以。

下面的例子演示了如何使用 throw 关键字:
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. char get_char(const string &, int);
  5. int main(){
  6. string str = "c plus plus";
  7. try{
  8. cout<<get_char(str, 2)<<endl;
  9. cout<<get_char(str, 100)<<endl;
  10. }catch(int e){
  11. if(e==1){
  12. cout<<"Index underflow!"<<endl;
  13. }else if(e==2){
  14. cout<<"Index overflow!"<<endl;
  15. }
  16. }
  17. return 0;
  18. }
  19. char get_char(const string &str, int index){
  20. int len = str.length();
  21. if(index < 0)
  22. throw 1;
  23. if(index >= len)
  24. throw 2;
  25. return str[index];
  26. }
运行结果:
p
Index overflow!

在 get_char() 函数中,我们使用了 throw 关键字,如果下标越界,就会抛出一个 int 类型的异常:如果是下溢,异常数据的值为 1;如果是上溢,异常数据的值为 2。在 catch 中,将捕获 int 类型的异常,然后根据异常数据输出不同的提示语。

不被建议的用法

throw 关键字除了可以用在函数体中抛出异常,还可以用在函数头和函数体之间,指明函数能够抛出的异常类型。有些文档中称为异常列表。例如:
double func (char param) throw (int);
这条语句声明了一个名为 func 的函数,它的返回值类型为 double,有一个 char 类型的参数,并且只能抛出 int 类型的异常。如果抛出其他类型的异常,try 将无法捕获,只能终止程序。

如果希望能够抛出多种类型的异常,可以用逗号隔开:
double func (char param) throw (int, char, exception);
如果不希望限制异常类型,那么可以省略:
double func (char param) throw ();
如此,func() 函数可以抛出任何类型的异常,try 都能捕获到。

更改上例中的代码:
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. char get_char(const string &, int) throw(char, exception);
  5. int main(){
  6. string str = "c plus plus";
  7. try{
  8. cout<<get_char(str, 2)<<endl;
  9. cout<<get_char(str, 100)<<endl;
  10. }catch(int e){
  11. if(e==1){
  12. cout<<"Index underflow!"<<endl;
  13. }else if(e==2){
  14. cout<<"Index overflow!"<<endl;
  15. }
  16. }
  17. return 0;
  18. }
  19. char get_char(const string &str, int index) throw(char, exception){
  20. int len = str.length();
  21. if(index < 0)
  22. throw 1;
  23. if(index >= len)
  24. throw 2;
  25. return str[index];
  26. }
在使用 GCC 的 IDE 中运行代码,执行到第 12 行时程序会崩溃。虽然 func 函数检测到下标越界,知道发生了异常,但是由于 throw 限制了函数只能抛出 char、exception 类型的异常,所以 try 将捕获不到异常,只能交给系统处理,终止程序。

需要说明的是,C++标准已经不建议这样使用 throw 关键字了,因为各个编译器对 throw 的支持不同,有的直接忽略,不接受 throw 的限制,有的将 throw 作为函数签名,导致引用函数时可能会有问题。上面的代码在 GCC 下运行时会崩溃,在 VS 下运行时则直接忽略 throw 关键字对异常类型的限制,try 可以正常捕获到 get_char() 抛出的异常,程序并不会崩溃。

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

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

相关文章

git - svn 平滑到 git

1. 建立自己的git仓库&#xff0c;需要是空git仓库 2. checkout 你的 git仓库 3. svn忽略.git文件&#xff0c;忽略.git .gitignore 4. 把 .git文件拷到你的 svn仓库 5. git 上传文件 ————可以用&#xff0c;但是不符合我的情况———— 1. 所有需要用到的&#xff1a;git…

Logback也爆漏洞了,总结下最近log相关的几个漏洞

大家好&#xff0c;我是君哥&#xff0c;周末又要结束了。前些天 Apache Log4j2 接连报了几个重大漏洞&#xff0c;好在我们的系统使用的 logback&#xff0c;可当我们正庆幸的时候&#xff0c;logback 也爆出漏洞了。今天我们一起来看一下这几个漏洞。CVE-2021-42550先看一下官…

vim配置php语法高亮

安装vim之后&#xff0c;将php语法高亮插件 php.vim&#xff0c;放到/usr/share/vim/vimfiles/syntax 目录下 php语法高亮插件在这里下载&#xff1a;http://www.vim.org/scripts/script.php?script_id1571 然后配置vim配置文件 vimrc 在这里 /etc/vimrc ,增加一行 “s…

九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题

九月十月百度人搜&#xff0c;阿里巴巴&#xff0c;腾讯华为小米搜狗笔试面试八十题 引言 自发表上一篇文章至今&#xff08;事实上&#xff0c;上篇文章更新了近3个月之久&#xff09;&#xff0c;blog已经停了3个多月&#xff0c;而在那之前&#xff0c;自开博以来的21个月每…

C++ exception类

语言本身或者标准库抛出的异常都是 exception 的子类&#xff0c;称为标准异常&#xff08;Standard Exception&#xff09;。你可以通过下面的语句来匹配所有标准异常&#xff1a; try{ //可能抛出异常的语句}catch(exception &e){ //处理异常的语句} 之所以使用引用…

拿了年终奖后,发现自己又拖后腿了?对不起,可能事实并没有那么糟糕...

全世界只有3.14 % 的人关注了爆炸吧知识不平凡的2020年早已过去了&#xff0c;打工人们已经跨过了2021年的门槛。2021年将会怎么样&#xff0c;那只有到2021年结束后我们才会知道。但我们的情绪常常毫无例外地会被“年终奖”这个关键词所扰动&#xff0c;无论在什么时候&#x…

JAVA-MyBatis ORM

MyBatis 的前身就是 iBatis 。是一个数据持久层(ORM)框架。 iBATIS一词来源于“internet”和“abatis”的组合&#xff0c;是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects&#xff08;DAO&#xff09;&#xff0c;同时还提供一个利用这…

Leetcode: Single Number

Given an array of integers, every element appears twice except for one. Find that single one.Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? Analysis: 需求里面要求O(N)时间以及无额外空间&…

如何使用 C# 压缩单个文件?

咨询区 user3362735我的项目有一个需求&#xff0c;需要对 文件夹 下的文件进行压缩&#xff0c;我用 ZipFile.CreateFromDirectory 方法发现并不能成功&#xff0c;但我对整个文件夹压缩是没有问题的&#xff0c;请问我该如何正确实现&#xff1f;回答区 John Koerner可以借助…

Android之mediarecorder中的方法以及工作流程的过程

嵌套、关联的类 class MediaRecorder.AudioEncoder 定义音频编码 class MediaRecorder.AudioSource 定义声音资源 interface MediaRecorder.OnErrorListener Interface definition for a callback to be invoked when an error occurs while recording. int…

杭电Problem 1872 稳定排序

稳定排序 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5200 Accepted Submission(s): 1988Problem Description大家都知道&#xff0c;快速排序是不稳定的排序方法。如果对于数组中出现的任意a[i],a[j](i<…

AMD and CMD are dead之KMD.js依赖可视化工具发布

使用 require("MyAapp.DepTree", function (DepTree) {DepTree(({renderTo: "holder",width: "820",height: "580",data: [{ "name": "System" },{ "name": "Util" },{ "name": &q…

WPF中的触发器(Trigger)

这节来讲一下WPF中的触发器——Trigger。触发器&#xff0c;是指在既定条件或者特殊场景下被触发&#xff0c;从而去执行一个操作。在WPF中&#xff0c;触发器可以分为以下几类&#xff1a;基本触发器(Trigger)&#xff1b;事件触发器(EventTrigger)&#xff1b;数据触发器(Dat…

uCOS:时钟节拍代码追踪

uCos中的时钟节拍可以基于软中断实现或者基于时钟节拍任务&#xff08;但是这个任务要给予很高的优先级&#xff09;对于STM32&#xff08;Cortex-M3&#xff09;来说这个就是SysTick中断0x0000003C当中断发生时调用OS_CPU_SysTickHandler函数&#xff0c;这样就提供了系统的时…

数学之美番外篇:平凡而又神奇的贝叶斯方法

概率论只不过是把常识用数学公式表达了出来。 ——拉普拉斯 记得读本科的时候&#xff0c;最喜欢到城里的计算机书店里面去闲逛&#xff0c;一逛就是好几个小时&#xff1b;有一次&#xff0c;在书店看到一本书&#xff0c;名叫贝叶斯方法。当时数学系的课程还没有学到概率统计…

Android之用jadx进行反编译

利用开源项目jadx反编译Android应用 利用Github开源项目jadx可以直接对 .dex, .apk, .jar, .class 类型的文件进行直接反编译对比之前 apktool(解包apk) dex2jar(将.dex转换成.jar) jd-gui (查看.jar文件)反编译三件套, jadx的优点在于: 1. 可以一行命令直接反编译恢复出.…

linux red hat 安装svn

安装步骤如下&#xff1a;1、yum install subversion 2、输入rpm -ql subversion查看安装位置&#xff0c;如下图&#xff1a;我们知道svn在bin目录下生成了几个二进制文件。输入 svn --help可以查看svn的使用方法&#xff0c;如下图。3、创建svn版本库目录mkdir -p /var/svn/s…

RTP在。net中的使用(资料)

开源组件&#xff1a;lumisoft 网址&#xff1a;http://www.lumisoft.ee/lswww/download/downloads/Examples/ 非开源的免费组建&#xff1a;rtp.net &#xff08;微软推荐&#xff09;转载于:https://www.cnblogs.com/foreverme/p/3799129.html