C++语法小记---异常处理
异常处理(C语言)
异常是对代码中可以预知的问题进行处理;代码中不可以预知的问题叫Bug;
if () { ... } else { ... }
setjmp和longjmp
#include <stdio.h>
#include <setjmp.h> jmp_buf env = {}; int divid(int a, int b)
{
if(b == )
{
longjmp(env, ); //2. 恢复保存的上下文,并设置setjmp的返回值(第二个参数)
}
else
{
return a / b;
}
} int main()
{
if(setjmp(env) == ) //1. 保存当前上下文,返回为0;
//3. 调用longjmp后,返回此处,返回值为longjmp设置的返回值
{
printf("divid(1, 0) = %d\n", divid(, ));
}
else
{
printf("Unexpected!!\n");
} return ;
}
异常处理(C++语言)
C++在语言层面提供异常的处理机制
异常的抛出和处理分开,更合理、灵活
try { ... } catch { ... }
使用throw关键字抛出异常,抛出的异常可以是任何类型,基础类型、类类型以及自定义类型都可以
异常抛出后,会沿着函数调用的顺序向上依次寻找捕捉的地方,如果找不到,程序终止;如果找到(匹配到catch),进入catch进行处理,程序不终止
一个try可以接续多个catch,catch的匹配规则如下:
每个异常只能被一个catch分支处理
匹配的过程从上至下依次匹配
匹配的规则类似函数调用的过程,但是不进行隐式类型转换,严格参数匹配
抛出的异常会有用于初始化catch中的参数
基类可以匹配子类的异常
不一定要使用C++库中提供的异常,可以使用自定义的异常
一般使用可变参数作为最后一个catch分支,做楼底处理
try { ... } catch { ... }可以嵌套,工程意义是对异常进行重新解释,做兼容处理
#include <iostream>
#include <string> using namespace std; void func() //嵌套,对异常进行重新封装解释
{
try
{
throw ;
}
catch(int i)
{
if(i == )
{
throw string("error no 2");
}
}
} int main()
{
try
{
throw ;
}
catch(int e)
{
cout<< "catch(int e)" << endl;
}
catch(...)
{
cout<< "catch(...)" <<endl;
} try
{
func();
}
catch(string e)
{
cout<< e <<endl;
} return ;
}
C++语法小记---异常处理的更多相关文章
- Jinja2语法小记
jinja2模板语法小记 Jinja2模板中文文档 三种常见界定符 表达式 {{ ... }} 用于装载字符串.变量.函数调用等 语句 {% ... %} 用于装载控制语句,比如if判断.for循环等 ...
- C++语法小记---开篇
几句闲话 由于C++的语法非常的复杂,但是实际使用的过程中,经常使用的语法也就那么一些,还有比较多的语法很少被使用,时间一长就容易忘记,因此“C++语法小记”主要是将C++中不经常使用和容易忘记的语法 ...
- Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础
本节内容: 1. 面向对象高级语法部分 1.1 静态方法.类方法.属性方法 1.2 类的特殊方法 1.3 反射 2. 异常处理 3. Socket开发基础 1. ...
- Java语法基础-异常处理
异常处理类层次结构图 检查异常与非检查异常 非检查异常(unckecked exception):Error 和 RuntimeException 以及他们的子类.javac在编译时,不会提示和发现这 ...
- Python基本语法_异常处理详解
目录 目录 异常 异常类型 异常处理 触发异常raise 传递异常 assert语句触发异常 捕获异常tryexceptelse 捕捉多个异常 tryfinally语句 自定义异常 withas触发异 ...
- WINDOWS Server2008上部署Oracle10g及oracle SQL语法小记
首先安装10G客户端 情况一:一般都会安装到一般报错.因为10G是32BIT客户端.而操作系统是64位的.但是不会影响配置监听程序.自主开发的应用程序依然可以运行. 情况二:报错但是配置完监听程序始终 ...
- CSS语法小记
一.CSS语法结构 语法:选择符{属性:值} 例如:body{font-size:12px;} 参数说明: 1.选择符(Selector):指明这组样式所要针对的对象.可以是一个XHTML标签,例如h ...
- Object Pascal 语法之异常处理
http://www.cnblogs.com/spider518/archive/2010/12/30/1921298.html 3 结构化异常处理 结构化异常处理(SHE)是一种处理错误的手段,使得 ...
- Python 3语法小记(四)字典 dictionary
字典是Python里面一种无序存储结构,存储的是键值对 key - value.关键字应该为不可变类型,如字符串.整数.包含不可变对象的元组. 字典的创建很简单,用 d = {key1 : value ...
随机推荐
- C/C++语言的学习方向
这个世界上有太多的坑,如果我们不具备查阅资料的能力和对现实世界的思考能力,入坑是大概率的事情. C/C++语言能做什么?C/C++程序员在做什么?企业需要什么样的C/C++程序员?对初学者来说,要搞清 ...
- 在运行时生成C# .NET类
本文译自:Generating C# .NET Classes at Runtime 作者:WedPort 在我的C#职业生涯中,有几次我不得不在运行时生成新的类型.希望把它写下来能帮助有相同应 ...
- [ C++ ] 勿在浮沙筑高台 —— 内存管理(18~31p) std::alloc
部分内容个人感觉不是特别重要,所以没有记录了.其实还是懒 embedded pointers 把对象的前四字节当指针用. struct obj{ struct obj *free_list_link; ...
- java scoket Blocking 阻塞IO socket通信二
在上面一节中,服务端收到客户端的连接之后,都是new一个新的线程来处理客户端发送的请求,每次new 一个线程比较耗费系统资源,如果100万个客户端,我们就要创建100万个线程,相当的 耗费系统的资源, ...
- springBoot--集成RocketMQ
1.导入依赖 <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>sprin ...
- JNI调用Cython生成库‘undefined symbol: PyInit_’问题
最近项目需要提升所有 Python 算法的执行时间,并给 Java 框架调用,根据 Python一键转Jar包,Java调用Python新姿势!的思路可以用 Cython 将 Python 代码转换为 ...
- 如何去除List集合中重复的元素
1.通过循环进行删除 public static void removeDuplicate(List list) { for ( int i = 0 ; i < list.size() - 1 ...
- plsql启动报 Using filter for all users can lead to poor perform
首先,这个与Oracle配置无关,就是在使用pl/sql左侧树形目录时会看到非常多的和你当前工作无关的表,视图,序列等,导致打开速度慢. 解决办法:Tools-->Object browser ...
- Git 新建版本库命令
Command line instructions Git global setup git config --global user.name "张三" git config - ...
- 如何写出高性能的CSS3动画
小伙伴们在写CSS3动画时,会发现在手机上很多时候会感到卡顿,然后Google到的解决方案大多是开启GPU加速transform: translate3d(0,0,0); 可解决,但是为什么开启GPU ...