C++每日一练(异常)

57 阅读2分钟

本文已参与「新人创作礼活动」,一起开启掘金创作之路。

一、今日课题

异常

二、实战演练

异常事件在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;
}