一、简介

  在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) {}
};

最新文章

  1. hibernate的Criteria条件查询
  2. Light OJ 1068
  3. HiveQL(HiveSQL)跟普通SQL最大区别一直使用PIG,而今也需要兼顾HIVE
  4. C# Web Api 上传文件
  5. Android实现电子邮箱客户端
  6. 总结swift 1.2适配swift2.0遇到的改变
  7. 宜昌IT软件资源汇总
  8. 几种更新(Update语句)查询的方法【转】
  9. symfony2-创建提交表单生成数据过程
  10. 利用Crowbar抓取网页异步加载的内容 [Python俱乐部]
  11. Win7添加php环境变量.
  12. 从嵌入式linux到android应用开发
  13. 【转载】 第四范式涂威威:AutoML技术现状与未来展望
  14. Python高阶函数map、reduce、filter、sorted的应用
  15. 分形之闵可夫斯基(Minkowski)
  16. C语言版本:顺序表的实现
  17. Vakuum开发笔记02 核心与安全问题
  18. GPG key retrieval failed
  19. iOS Ad hoc
  20. Qt_DLL_4_MFC

热门文章

  1. Error Curves HDU - 3714
  2. Communications link failure异常解决
  3. tomcat启动很慢很慢很慢
  4. 【BZOJ3670】动物园(KMP算法)
  5. linux优化项
  6. react ( 二 )
  7. 利用Cglib实现AOP
  8. 如何为Web应用选择托管主机
  9. js备战春招の四のdevtool中各种错误、调试的使用技巧
  10. Hive数据仓库笔记(二)