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 ...
随机推荐
- selenium3.0-selenium发展史
- 「从零单排canal 03」 canal源码分析大纲
在前面两篇中,我们从基本概念理解了canal是一个什么项目,能应用于什么场景,然后通过一个demo体验,有了基本的体感和认识. 从这一篇开始,我们将从源码入手,深入学习canal的实现方式.了解can ...
- java web20套项目
http://shenghuo.lshou.com/c4154/t5bdbcc98b9a9.html
- Idea+springboot入坑之路
环境准备 IDEA 社区版: 2019.3 jdk: 1.8.0_241 tomcat: 7.0.99 maven: 3.6.3 spring-boot:2.2.5.RELEASE 插件 spring ...
- GIT更换连接方式
1-使用 git remote -v 查看对应的克隆地址: git remote -v origin https://github.com/username/repository.git (fetch ...
- 03 . Shell数组和函数
Shell数组 简介 数组中可以存放多个值.Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似). 与大部分编程语言类似,数组元素的下标由0开始. S ...
- 《UNIX环境高级编程》(APUE) 笔记第八章 - 进程控制
8 - 进程控制 Github 地址 1. 进程标识 每个进程都有一个非负整型表示的 唯一进程 ID .进程 ID 是可复用的(延迟复用算法). ID 为 \(0\) 的进程通常是调度进程,常常被称为 ...
- IDEA从Github中Clone Maven项目,解决树形目录及Jar包依赖的问题
很多人在开发中都会碰到的一个问题,当我们用IDEA从Github中检出Maven工程后(Java),发现既不能运行,也不能编译,左侧的树形目录还怪怪的,现在就来说说如何解决这个问题. IDEA从git ...
- node 模块正确暴露方法
一个node模块,为了能够服用,就需要将其暴露,那么如何正确写呢?(参考:https://developer.mozilla.org/zh-CN/docs/Learn/Server-side/Expr ...
- Android 伤敌一千自损八百之萤石摄像头集成(二)
本章主要是结合webview展示直播 app负责配网展示设备 加载webview播放 不介绍别的只说集成,至于APP_KEY.accessToken怎么获取的不予解释,官网都有 获取WiFi名称 这里 ...