本文已参与「新人创作礼活动」,一起开启掘金创作之路。
一、今日课题
二、实战演练
异常事件在C++中表示为异常对象(exception object)。异常事件发生时,由操作系统为程序设置当前异常对象,然后执行程序的当前异常处理代码块,在包含了异常出现点的最内层的try块,依次匹配同级的catch语句。如果匹配catch语句成功,则在该catch块内处理异常;然后执行当前try...catch...块之后的代码。如果在当前的try...catch...块没有能匹配该异常对象的catch语句,则由更外一层的try...catch...块处理该异常;如果当前函数内的所有try...catch...块都不能匹配该异常,则递归回退到调用栈的上一层函数去处理该异常。如果一直回退到主函数main()都不能处理该异常,则调用系统函数terminate()终止程序。
1)有何用?
便于使用者在程序出现异常情况下,使用库或者组件的开发者能快速定位出库、组件还是有用程序的错误。
2)怎么用?
- 异常捕获机制
- 异常的抛出
- 示例代码
#include<iostream>
#include<string>
using namespace std;
#define TYPE_CLASS 0 //抛出自定义类类型对象的异常
#define TYPE_INT 1 //抛出整型的异常
#define TYPE_ENUM 2 //抛出枚举的异常
#define TYPE_FLOAT 3 //抛出float的异常
#define TYPE_DOUBLE 4 //抛出double的异常
typedef int TYPE; //异常的类型
enum Week { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };
//自定义的异常类
class MyException {
public:
MyException(string msg) { err_msg = msg; }
void ShowErrorMsg() { cerr << err_msg << endl; }
~MyException() {}
private:
string err_msg;
};
//抛出异常的函数
//其中 throw (MyException,int,Week) 称之为异常规范,
//它告诉了编译器,该函数不会抛出其他类型的异常
//异常规范可以不写,默认为可以抛出任何类型的异常
//如果一个异常我们没有的捕获,会被系统调用terminate处理。
//如果一个异常类型,没有写入异常规范,我们使用catch无法捕获到,会被系统捕获,调用terminate
void KindsOfException(TYPE type) throw (MyException, int, Week, float, double) {
switch (type) {
case TYPE_CLASS:
throw MyException("Exception! Type of Class"); //类
break;
case TYPE_INT:
throw 2011; //整型
break;
case TYPE_ENUM:
throw Monday; //枚举
break;
case TYPE_FLOAT:
throw 1.23f; //float
break;
case TYPE_DOUBLE:
throw 1.23; //double
break;
default:
break;
}
}
int main()
{
int type;
cout << "Input the type(0,1,2,3,4): ";
cin >> type;
try {
KindsOfException(type);
}
catch (MyException e) { //如果我们使用了throw 异常规范,但是没把MyException写入throw列表,
e.ShowErrorMsg(); //这里还是捕获不到MyException异常的,会被系统调用terminate处理。
}
catch (float f) {
cerr << "float" << f << endl;
}
catch (double d) {
cerr << "double" << d << endl;
}
catch (int i) {
cerr << "Exception! Type of Int -->" << i << endl;
}
catch (Week week) {
cerr << "Exception! Type of Enum -->" << week << endl;
}
//可以有更多的catch语句
return 0;
}