C++语言-07-异常处理和信号处理
异常处理
概述
- 概念
- 异常是指在程序运行时发生的特殊情况,C++ 中提供了一套异常处理机制,标准库 提供了异常处理的基础
- 作用
- 异常提供了一种转移程序控制权的方式
- 与异常处理相关的关键字
- throw
- 用于标记可能抛出的异常的操作
- 当异常条件被触发时,程序会抛出(throw)一个异常,由 catch 捕获相应的异常,程序跳转到 catch 块定义的异常处理代码
- try
- 用于监测某个操作是否抛出异常
- try 块中的代码是可能抛出异常的代码,其后通常跟随一个和多个 catch 块用于在抛出异常的情况下处理异常
- catch
- 用于定义处理其前 try 块可能抛出的异常的代码
- 可以使用多个 catch 块分别处理不同的异常
- 也可以使用一个 catch 块处理所有的异常
- throw
- 概念
处理流程
- 异常处理的格式
标记异常
/**
exceptionHandle() 函数为可能抛出异常的函数,需要使用 throw 关键字标记
*/
void exceptionHandle() {
// 在 condition 条件下抛出异常
if (condition) {
throw exceptionInfo;
}
}
捕获异常
分别捕获不同的异常
try {
// 可能抛出异常的代码
} catch(Exception1 e) {
// 处理 Exception1 类型的异常
} catch(Exception2 e) {
// 处理 Exception2 类型的异常
}
捕获所有的异常
try {
// 可能抛出异常的代码
} catch(...) {
// 处理 try 抛出的所有异常
}
- 异常处理的格式
示例
标记可能抛出的异常的操作
/** 除法函数 */
double division(double dividend, double divisor) {
if (divisor == 0) {
// 标记除 0 异常
throw "Division by zero condition!";
}
return dividend / divisor;
}
捕获并处理异常
int main(int argc, const char * argv[]) {
// 定义相关的变量
double dividend = 250;
double divisor = 0;
double divisionResult;
// 异常处理代码块
try {
// 监测可能抛出的异常的操作
divisionResult = division(dividend, divisor);
cout << divisionResult << endl;
} catch (const char *exceptionInfo) {
// 处理异常
cerr << exceptionInfo << endl;
}
return 0;
}
此示例的异常处理结果如图

信号处理
概述
信号是由操作系统传递给进程的中断,会造成程序的提前终止。在 Terminal 中可以使用组合键 ctrl + C 产生中断。需要注意的是,并非所有的中断都可以被捕获。C++中的中断定义在头文件 <csignal>
信号
C++的头文件 定义了一下可捕获的中断信号
描述 ABRT FPE ILL INT SEGV TERM
相关函数
- 产生中断信号
函数原型
int raise(int sig);
// sig 是要发送的信号编码
- 捕获中断信号
函数原型
void (*signal(int, void (*func)(int)))(int);
/**
sig:为信号的编码
func:为指向信号处理函数的指针
*/注意
- 在捕获中断信号前,必须使用 signal 函数注册
- 产生中断信号
示例
使用 raise 函数生成信号,使用 signal 函数捕获信号
// 中断处理函数
void signalHandle(int signalNumber) {
cout << "Interrupt signal(" << signalNumber << ")received." << endl;
exit(signalNumber);
}
// main 函数
int main(int argc, const char * argv[]) {
int i = 0;
// 注册中断信号与中断处理函数
signal(SIGINT, signalHandle);
// 产生中断
while (++i) {
cout << "Going to sleep..." << endl;
if (i == 2) {
raise(SIGINT);
}
sleep(1);
}
return 0;
}
C++语言-07-异常处理和信号处理的更多相关文章
- Go语言中异常处理painc()和recover()的用法
Go语言中异常处理painc()和recover()的用法 1.Painc用法是:用于抛出错误.Recover()用法是:将Recover()写在defer中,并且在可能发生panic的地方之前,先调 ...
- python面向对象07/异常处理
python面向对象07/异常处理 目录 python面向对象07/异常处理 1. 异常错误分类 2. 什么是异常? 3. 异常处理 4. 为什么要有异常处理 5. 异常处理的两种方式 1.if判断 ...
- Go语言之异常处理
在编写Go语言代码的时候,我们应该习惯使用error类型值来表明非正常的状态.作为惯用法,在Go语言标准库代码包中的很多函数和方法也会以返回error类型值来表明错误状态及其详细信息. error是一 ...
- C语言07指针高级
01内存四区 接口封装和设计思想引导 接口封装设计思想引导 Sckclient客户端api模型设计 第一套api函数 #ifndef _SCK_CLINT_H_ #define _SCK_CLINT_ ...
- 第六十三课、C语言的异常处理
http://www.cnblogs.com/gui-lin/p/6379101.html 一.异常处理 1.异常的概念 (1).程序在运行过程中可能产生异常 (2).异常(Exception)和Bu ...
- c#基础语言编程-异常处理
异常的定义 异常就是程序中的运行时错误,当出现异常时,系统会捕获这个错误并抛出一个异常.若程序没有提供处理该异常的代码,系统会挂起这个程序. 常见异常的类型 System.Exception 最泛化的 ...
- obj-c编程07:异常处理
好了,到了相对轻松的话题,也是所有语言无可避免的话题:异常的处理. 我们知道对于一些常见的语言,"异常"是逃不开避不掉的主题:C中相对原始的signal或依赖系统异常支持(比如wi ...
- C语言-07其它相关
预处理指令 /* 不带参数的宏定义 1.所有的预处理指令都是以#开头 2.预处理指令分3种 1> 宏定义 2> 条件编译 3> 文件包含 3.预处理指令在代码翻译成0和1之前执行 4 ...
- C#语言-07.文件操作
a. 文件操作:适用于相对简单的数据保存 i. 读写文件的步骤: . 创建文件流 . 创建读写器 . 读写文件 . 关闭读写器 . 关闭文件流 ii. FileStream(文件流),它主要用于读写文 ...
- [R]R语言里的异常处理与错误控制
之前一直只是在写小程序脚本工具,几乎不会对异常和错误进行控制和处理. 随着脚本结构和逻辑更复杂,脚本输出结果的准确性验证困难,同时已发布脚本的维护也变得困难.所以也开始考虑引入异常处理和测试工具的事情 ...
随机推荐
- 【原创】Kakfa log包源代码分析(二)
八.Log.scala 日志类,个人认为是这个包最重要的两个类之一(另一个是LogManager).以伴生对象的方式提供.先说Log object,既然是object,就定义了一些类级别的变量,比如定 ...
- node.js中使用https请求报CERT_UNTRUSTED的问题解决
只要调用了没有受信的https就会报错:CERT_UNTRUSTED 简单的解决方法就是设置环境变量回避非授信证书的问题. 只要在请求的代码之前加上如下代码即可: process.env.NODE_T ...
- 【C#】让ReSharper灰色显示未使用的非私有成员的关键
环境:VS2010+ReSharper8 先说答案: 1.在Inspection Severity中设置Non-private accessibility为Warning.如图: 该页面在ReShar ...
- 词法分析程序 LEX和VC6整合使用的一个简单例子
词法分析的理论知识不少,包括了正规式.正规文法.它们之间的转换以及确定的有穷自动机和不确定的有穷自动机等等... 要自己写一个词法分析器也不会很难,只要给出了最简的有穷自动机,就能很方便实现了,用if ...
- C#的变迁史 - C# 4.0 之多线程篇
在.NET 4.0中,并行计算与多线程得到了一定程度的加强,这主要体现在并行对象Parallel,多线程Task,与PLinq.这里对这些相关的特性一起总结一下. 使用Thread方式的线程无疑是比较 ...
- Guava并发:ListenableFuture与RateLimiter示例
ListenableFuture顾名思义就是可以监听的Future,它是对java原生Future的扩展增强 RateLimiter类似于JDK的信号量Semphore,他用来限制对资源并发访问的线程 ...
- ubuntu16.4下用jexus部署asp.net core rtm
上篇文章介绍了下用vs发布部署到iis环境,今天说下ubuntu 下部署asp.net core,不需要安装.net core sdk,自带运行时方式部署,利用jexus服务器转发请求到asp.net ...
- 修正 ListView 搜寻问题
问题:如果 SearchEdit 里已输入过搜寻字,再新建 ListView 项目后,会无法显示. 适用:Delphi XE5 源码下载:[原创]修正ListView搜寻问题.zip procedur ...
- 使用JPA储存Text类型的时候 出现乱码的问题
以前遇到这类问题第一个反应就是觉得客户端和服务端的编码不一样导致的.所以一开始也是那么认为的.以为我们项目使用的是pgsql,默认的就是utf-8,然后我们使用了字符也是utf-8,并且还有一个问题就 ...
- Guava学习笔记:Guava新增集合类型-Multiset
Guava引进了JDK里没有的,但是非常有用的一些新的集合类型.所有这些新集合类型都能和JDK里的集合平滑集成.Guava集合非常精准地实现了JDK定义的接口.Guava中定义的新集合有: Multi ...