文章目录
- 一、异常处理的概念
- 二、异常编写的步骤(来自图论教育)
- 三、栈展开和异常捕获
- 四、C++11中noexcep关键字
一、异常处理的概念
- 异常是程序可能检测到的,运行时不正常的情况,如存储空间耗尽,数组越界,被0除等
- c语言处理程序运行时的错误方式:
1.使用assert断言终止程序的运行
2.断言不成立时,会调用abort()函数终止程序
3.返回错误码;系统很多库的接口函数都是通过把错误码放到errno中,表示错误信息
4.服务器开发中使用日志文件:将错误信息写入日志文件,当有致命发生时终止程序的执行 - C++的异常机制,C++提出了一些内置的语言来产生(raise)或抛出异常(throw),用以通知“异常”已经“发生”,然后由预先安排的程序来捕获(catch)异常,并对它进行处理。
#include<iostream> 1
using namespace std;
class my_overflow_error // 算术计算上溢
{
const char* m_what;
public:
my_overflow_error() :m_what(nullptr) {}
my_overflow_error(const char* msg) :m_what(msg) {}
~my_overflow_error() { m_what = nullptr; }
const char* what() const
{
return m_what != nullptr ? m_what : "unknown exception";
}
};
double Div(double a, double b)
{
if (0 == b)
{
throw my_overflow_error("除0错误");
}
return a / b;
}
int main()
{
double x, y, z;
cin >> x >> y; // 输入 1,2; 输入 2, 0 ;
try
{
z = Div(x, y);
cout << "z: " << z << endl;
}
catch (my_overflow_error& e)
{
cout << e.what() << endl;
}
return 0;
}
注释:代码来自图论教育
二、异常编写的步骤(来自图论教育)
- 第一步: throw 表达式抛出异常为异常处理的第一步。throw表达式也可以抛出任何类型的对象, 如枚举、整数等等。但最常用的是类对象。
- 第二步:使用关键字try,构成一个try语句块(try block),该语句块所调用的函数中有能够抛出 异常的语句(throw )。
- 第三步:由catch字句捕获并处理异常。 catch子句由三部分组成:关键字catch、圆括号中的异常声明以及复合语句中的一组语句。
- 注意: catch子句不是函数,所以圆括号中不是形参,而是一个异常类型声明,可以是类型也可以是类型加 对象。
- catch子句的使用:它只有一个子句,没有定义和调用之分。使用时由系统按规则自动在catch子句列 表中匹配。
- catch子句可以包含返回语句(return),也可不包含返回语句。包含返回语句,则函数结束。而不包含返回语句,则执行catch列表之后的下一条语句。
- 异常抛出,测试块以及函数块后面的语句都无法执行
三、栈展开和异常捕获
四、C++11中noexcep关键字
void funa()throw(){} //C++11将此异常规范舍去,throw(int,string)只能抛出整型和字符串异常,找是否有处理异常的机制
void funb()noexcept(true){} //只要抛出异常,当前程序终止,不进行栈展开
void func()noexcept(false){}