C++之异常捕获和处理
一、简介
在C++语言中,异常处理包括:throw表达式,try语句块,一套异常类。其中,异常类用于在throw表达式和相关的catch子句之间传递异常的具体信息。exception头文件定义了最普通的异常类exception,它只报告异常的发生,不提供任何额外信息。以下是定义在stdexcept头文件中的常用的异常类:
| 异常类 | 解释 |
|---|---|
| exception | 最常见的问题 |
| runtime_error | 只有在运行时才能检测出的问题 |
| range_error | 运行时错误:生成的结果超出了有意义的值域范围 |
| overflow_error | 运行时错误:计算上溢 |
| underflow_error | 运行时错误:计算下溢 |
| logic_error | 程序逻辑错误 |
| domain_error | 逻辑错误:参数对应的结果值不存在 |
| invalid_argument | 逻辑错误:参数无效 |
| length_error | 逻辑错误:试图创建一个超过该类型最大长度的对象 |
| out_of_range | 逻辑错误:使用一个超出有效范围的值 |
异常类只定义了一个名为what的成员函数,该函数没有任何参数,返回值是一个指向C风格字符串的const char*。
二、基本用法
直接贴代码,简单测试一下:
#include <stdexcept>
#include <iostream>
using namespace std;
void test() {
throw runtime_error("just for test!");
}
int main() {
try {
test();
} catch(runtime_error err) {
cout << err.what() << endl;
}
return 0;
}
/*
* 执行的结果不出意料,便是:just for test!
* 可以有多个catch语句块
* 找到了匹配的runtime_error便执行相应的catch语句块代码
*/
注意:当执行一个throw时,跟在throw后面的语句将不再被执行。且只有在catch语句块中可以使用
throw;这样的语句,表示当前的catch语句不足与完整地处理好这个异常,于是决定由更上一层的函数接着处理。
三、noexcept
概括来说,这个关键字有两种用法:作为函数限定符,作为一个一元运算符返回一个bool类型的右值常量表达式。
第一个用法中,noexcept放在函数的后面,一般而言,对于成员函数来说,放在const后面,而放在final、override或虚函数的=0之前。其表示该函数不会抛出异常,但如下情况也可以顺利编译:
void f() noexcept {
throw exception();
}
需要注意的是,函数指针及该函数指向的函数必须具有一致性的异常说明,如下:
void (*pf1)(int) noexcept;
void f() noexcept {}
void t() {}
pf1 = f; //正确,因为f能保证不抛出异常
pfi = t; //错误,因为t不能保证
第二个用法中,可以如下使用:
noexcept(f()) //若f保证不抛出异常,则返回true
//一个常用用法,等价于void t() {}
void t() noexcept(false) {}
//以下保证f和g的异常类型一致
void f() noexcept(noexcept(g()));
四、定义自己的异常类
假设你想设计一个异常类,名为test_error,其的效果和runtime_error一样,可以用如下代码:
class test_error : public runtime_error {
public:
explicit test_error(const string &s):
runtime_error(s) {}
};
C++之异常捕获和处理的更多相关文章
- .NET 基础 一步步 一幕幕[数组、集合、异常捕获]
数组.集合.异常捕获 数组: 一次性存储多个相同类型的变量. 一维数组: 语法: 数组类型[] 数组名=new 数组类型[数组长度]; 声明数组的语法: A.数据类型 [] 数组名称= new 数据类 ...
- MVC 好记星不如烂笔头之 ---> 全局异常捕获以及ACTION捕获
public class BaseController : Controller { /// <summary> /// Called after the action method is ...
- atitit.js浏览器环境下的全局异常捕获
atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...
- C#中的那些全局异常捕获
1.WPF全局捕获异常 public partial class App : Application { public App() { // 在异 ...
- Spring-MVC开发之全局异常捕获全面解读
异常,异常 我们一定要捕获一切该死的异常,宁可错杀一千也不能放过一个! 产品上线后的异常更要命,一定要屏蔽错误内容,以免暴露敏感信息! 在用Spring MVC开发WEB应用时捕获全局异常的方法基本有 ...
- JavaScript异常捕获
理论准备 ★ 异常捕获 △ 异常:当JavaScript引擎执行JavaScript代码时,发生了错误,导致程序停止运行: △ 异常抛出:当异常产生,并且这个异常生成一个错误信息: △ 异常捕获: ...
- SQLServer异常捕获
在SQLserver数据库中,如果有很多存储过程的时候,我们会使用动态SQL进行存储过程调用存储过程,这时候,很可能在某个环节就出错了,但是出错了我们很难去跟踪到出错的存储过程,此时我们就可以使用异常 ...
- Asp.Net MVC3(三)-MvcApp实现全局异常捕获
定义异常捕获类: [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMu ...
- iphone 异常捕获处理
iphone 异常捕获处理 1 void UncaughtExceptionHandler(NSException *exception) { 2 NSArray *arr = [exception ...
- iOS异常捕获
文章目录 一. 系统Crash 二. 处理signal 下面是一些信号说明 关键点注意 三. 实战 四. Crash Callstack分析 – 进⼀一步分析 五. demo地址 六. 参考文献 前言 ...
随机推荐
- ASP.NET Core MVC中构建Web API
在ASP.NET CORE MVC中,Web API是其中一个功能子集,可以直接使用MVC的特性及路由等功能. 在成功构建 ASP.NET CORE MVC项目之后,选中解决方案,先填加一个API的文 ...
- 一个简单的freemark输入输出的案例(二)
freemarker入门实例 1.设计思路 (1)新建Maven Project (2)生成freemarker模板 (3)写freemarker页面ftl文件 (4)写测试文件 2.新建Maven ...
- Java虚拟机的锁优化
1 锁偏向.当现成请求一个对象锁时,如果获得锁,则该对象锁进入偏向模式,当该线程再次请求该对象的锁时,无需再做任何同步操作. 可通过在Java虚拟机中开启参数-XX:+UseBasedLock开启偏向 ...
- 没什么技术含量的Remove Before Flight
航空业有很多值得我们借鉴和学习的工作方式,将来有时间我会给大家引荐更多实例. 仔细观察每架停泊着的飞机,会发现机身很多地方都挂着细长的红布条,上面写着"REMOVE BEFORE FLIGH ...
- [BZOJ1005] [HNOI2008] 明明的烦恼 (prufer编码)
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...
- 300行Kotlin代码实现的区块链
使用Kotlin实现的区块链基本逻辑! 源码地址 GitHub仓库 启动方式 启动参数添加 -Dserver.port=8080,启动不同的端口,模拟不同的节点. 假设目前启动了8080和8081两个 ...
- 一个10年Java程序员的年终总结,献给还在迷茫中的你
我越来越担心我作为一个Java程序员的未来. 恍然间,发现自己在这个行业里已经摸爬滚打将近10年了,原以为自己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了,但是今年在换工作 ...
- 极重要基础命令三剑客加find
find -type:以文件类型查找 -name:以文件名查找 ! 取反 sed命令实战: sed -n “2p” oldboy.txt 打印第二行 sed -n "1,2p" ...
- 算法精解:DAG有向无环图
DAG是公认的下一代区块链的标志.本文从算法基础去研究分析DAG算法,以及它是如何运用到区块链中,解决了当前区块链的哪些问题. 关键字:DAG,有向无环图,算法,背包,深度优先搜索,栈,BlockCh ...
- ValueError: Cannot feed value of shape ..
这里x_,y_是两个数字,当我运行时 with tf.Session() as sess: #定义session对象生成器 for step in range(201) : sess.run(trai ...