C++异常之二 基本语法
2. 异常处理的基本语法
下面是一个基本的代码例子,说明 throw、try、catch的基本用法,与 catch 的类型自动匹配:
1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5
6 int test_1(int num)
7 {
8 if (num != 0)
9 {
10 throw - 1; //抛出一个int类型的异常,如果 30 行传1过来,那么将会抛出该异常至36行的 try
11 }
12 else {
13 throw new string("抛出字符串异常"); //抛出一个字符串异常,如果 30 行传0过来,那么将会抛出该字符串异常,catch将会匹配42行
14 }
15
16 return 0;
17 }
18
19 int test_2(int num) //函数进行了嵌套
20 {
21 test_1(num);
22 return 0;
23 }
24
25 int main()
26 {
27 int ret = 0;
28 try //try中的方法的返回值会被下边的catch捕捉
29 {
30 ret = test_2(1); //传1过去,将会捕获test_1中的throw -1,将会直接跳出至41行。
31 }
32 catch (int error) { //捕捉到的值会传到 error 变量
33 printf("出现异常了!%d\n", error);
34 }
35 catch (string * error)
36 {
37 printf("捕捉到字符串异常:%s", error->c_str()); //如果30行传过去的是0,可以通过抛出的异常来找合适的类型 string
38 delete error;
39 }
40 catch (...) { //如果没有合适的类型将会进入这里的通配,如果没有这行通配你试着传个浮点型过来编译不会过的。
41 printf("catch...\n");
42 }
43
44 return 0;
45 }
这里在说一下抛出被拦截的情况,同样是上边的代码:
如果下方的代码 test_2 中拦截了 test_1 的异常,那么在main函数调用处将无法获得异常,除非在下方代码的 test_2 中再次抛出(如29行)。
1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5
6 int test_1(int num)
7 {
8 if (num != 0)
9 {
10 throw - 1; //抛出一个int类型的异常,返回到 20 行
11 }else{
12 throw new string("抛出字符串异常");
13 }
14
15 return 0;
16 }
17
18 int test_2(int num)
19 {
20 try //如果这里捕获异常,第38行中的 try 将捕获不到test_1的异常
21 {
22 test_1(num);
23 }
24 catch (...) {
25 printf("test_2 异常抛出");
26 throw 0.01;
27 }
28
29 /* throw */
30 //这里如果再 throw ,38行将会再次接收到 test_1 的异常
31
32 return 0;
33 }
34
35 int main()
36 {
37 int ret = 0;
38 try
39 {
40 ret = test_2(1); //传1过去,将会抛出 test_1 中的 throw -1
41 }
42 catch (int error) {
43 printf("出现异常了!%d\n", error);
44 }
45 catch (string * error)
46 {
47 printf("捕捉到字符串异常:%s", error->c_str());
48 delete error;
49 }
50 catch (...) {
51 printf("catch...\n");
52 }
53
54 return 0;
55 }
3.异常处理接口声明
4.异常类型的生命周期
4.1 throw 基本类型:
4.2 throw 字符串类型:
4.3 throw 类类型异常:
5.异常和继承
6.异常处理的基本思想
7.标准库里的异常类
C++异常之二 基本语法的更多相关文章
- SQLServer 2012异常问题(二)--由安装介质引发性能问题
原文:SQLServer 2012异常问题(二)--由安装介质引发性能问题 问题描述:生产环境一个数据库从SQLSERVER 2008 R2升级到SQLSERVER 2012 ,同时更换硬件,但迁移后 ...
- Azure Terraform(二)语法详解
一,引言 上篇文章开始,我们简单介绍了以下通过基础设施管理工具----- Terraform,通过它来统一管理复杂的云基础设施资源.作为入门演示,使用Terraform 部署Azure 资源组的方式直 ...
- Azure Bicep(二)语法简介
一,引言 上一篇文章有介绍到 Azure Bicep 的部署问题,文中也只是演示部署范围为 Sub,并将演示的 Azure Resource Group 到 Azure.给定 Bicep 文件,可以部 ...
- [转贴] 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开
一.程序错误 编译错误,即语法错误.程序就无法被生成运行代码. 运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 打开文件可能会失败 除法运算时分母可能为0 整数 ...
- 【C++】异常简述(二):C++的异常处理机制
上文简述了在C语言中异常的处理机制,本文主要讲解C++中的异常处理. 一.异常的语法格式 在C++中,异常的抛出和处理主要使用了以下三个关键字:try. throw . catch.其格式如下: 当我 ...
- Lua 学习笔记(二)语法、类型、值
首先Lua执行的每一段代码都称之为“程序块”,一个程序块也就是一连串的语句或命令,例如一个源码文件或一行代码.Lua语句之间并不需要分隔符,如代码中的换行就不起任何作用,当然为了养成编码习惯当两条或者 ...
- java学习面向对象之异常之二
我们知道当我们处理异常的时候,一个是声明,另外一个是捕捉. 捕捉:异常处理的捕捉方式,这是可以对异常进行针对性处理的方式.具体格式是: try { //需要被检测的异常 } catch(异常类 变量) ...
- Jade模板引擎学习(二)语法:代码、变量、循环、过滤器及mixin
Jade语法 一.代码 不会被缓冲代码 ul - for(var i=0; i; i++) li Jade Engine 会转换为: <ul> <li>Jade Engine& ...
- QML学习(二)——<QML语法>
一.Qml类型 QML类型分为三类:基本类型.QML对象类型以及JavaScript类型 1 基本类型 我们可以再qt帮助文档中搜索基本类型查看 基本类型的概念是相对于QML对象类型而言的,QML 对 ...
随机推荐
- Python_scrapyRedis零散
1. # Redis 1.解压,配环境变量 2.win上设置自启动 redis-server --service-install D:\redis\redis.windows.conf --logle ...
- IDA-hook so层方法与java之间的映射关键
第一步 1.首先用ida打开so文件 第二步 第三步
- [LeetCode题解]83. 删除排序链表中的重复元素 | 递归 + 迭代
方法一:递归 解题思路 通过递归法,每次判断目前头节点与给定的节点是否相等.如是,继续判断下一个节点,否则保存当前头节点,设置 next 指向下次递归得到的节点,然后返回当前节点. 代码 /** * ...
- 对于线程池ThreadPool的学习总结
线程池:就是一个管理线程的池子. 优点: 它帮我们管理线程,避免增加创建线程和销毁线程的资源损耗.因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一个对象,需要走GC垃圾回收流程,都是 ...
- CleanMyMac X“断网激活”真的能激活软件吗?
CleanMyMac X帮助Mac系统进行垃圾清理,清除多余的缓存.应用程序等,在提高工作效率上起了很大的作用.但是随着对软件的需求不断增加,很多人开始研究通过捷径破解正版软件,但是是否能成功呢?今天 ...
- jmeter压测mysql数据库
jmeter连接并压测mysql数据库,之前一直想用jmeter一下测试mysql数据库的性能,今天偶然看到一篇博客,于是乎开始自己动手实践. 一.准备工作 1.安装好mysql数据库,可以安装在本地 ...
- LGOJ5022 旅行 noip tg 2018
旅行 标签(空格分隔): noip2018 提高组 今天我给大家带来一份题解. 题目的大大致意思是这样的: $$ 有一颗 树/基环树 求最小遍历顺序 $$ 树的情况自然不必多讲.做一些末端的微处理(将 ...
- kafka 消息存储分析
kafka 可以支持海量数据发送,轻轻松松QPS过十万,如果JVM内存存储这一块如果不够优秀,根本无法支持这么庞大的QPS. 存储架构(这里这是落地数据,并木有涉及到序列化发送数据到broker) R ...
- 为k8s预留系统资源
为k8s预留系统资源 Kubernetes 的节点可以按照 Capacity 调度.默认情况下 pod 能够使用节点全部可用容量. 这是个问题,因为节点自己通常运行了不少驱动 OS 和 Kuberne ...
- C++基础入门知识:C++命名空间(名字空间)详解
一个中大型软件往往由多名程序员共同开发,会使用大量的变量和函数,不可避免地会出现变量或函数的命名冲突.当所有人的代码都测试通过,没有问题时,将它们结合到一起就有可能会出现命名冲突. 例如小李和小韩都参 ...