C++语言-07-异常处理和信号处理
2024-10-20 00:25:37
异常处理
概述
- 概念
- 异常是指在程序运行时发生的特殊情况,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;
}
最新文章
- 基于redis的处理session的方法
- Angular通过XHR加载模板而限制使用file://(解决方案)
- crontab设置作业间隔执行问题
- LEfSe分析
- VTK初学一,c_Line_CellArray线段的CellArray绘制
- linux退出vi
- python 基础知识(一)
- 转】MyEclipse使用总结——使用MyEclipse打包带源码的jar包
- C#反射(一) 【转】
- PHP 开发API接口 注册,登录,查询用户资料
- nginx 配置轮询服务
- ViewPager滑动标签-PagerSlidingTabStrip的使用
- 处理jQuery append加入的元素 绑定事件无效的方法
- 022 包含min函数的栈
- node.js监听文件变化
- IDEA中将WEB-INF\lib下的Jar包添加到项目中
- zabbix使用ICMP Ping模版实现对客户端网络状态的监控,监控丢包率、响应时间
- FusionCharts JavaScript API - Functions 常用方法整理笔记
- CURL命令测试网站打开速度
- 利用内存分析工具(Memory Analyzer Tool,MAT)分析java项目内存泄露