本文部分图片截取自B站懒猫老师。
视频链接为:https://www.bilibili.com/video/BV1t7411j74t?spm_id_from=333.1007.top_right_bar_window_history.content.click.
异常处理结束之后,跳转到最后一个catch块后面继续执行。异常执行完之后,程序不返回,而是继续往下执行。
总结:编译通过,程序运行过程中出现的错误。
下面,举“出栈”的例子来说明异常类的使用。
代码如下:
#includeusing namespace std; //栈 - 以存储字符型数据为例 const int MAX_SIZE = 5; //定义栈最大值常量 class Stack { private: char* data; //成员属性:线性表 int size; //成员属性:堆栈的实际大小 int top; //成员属性:栈顶 public: Stack(); //构造函数 Stack(int s); //有参构造函数 ~Stack(); //析构函数 void push(char ch); //成员函数:入栈 char pop(); //成员函数:出栈并返回栈顶元素 char getTop(); //成员函数:获得栈顶元素(不出栈) bool isEmpty(); //成员函数:栈是否为空 bool isFull(); //成员函数:栈是否为满 void setNull(); //成员函数:设置栈为空 class Full {}; class Empty {}; //由于这两个类都是放在Stack这个类声明的里面, 所以我们将其称为异常内部类 }; Stack::Stack() { size = MAX_SIZE; top = -1; data = new char[MAX_SIZE]; //缺省构造函数分配最大的内存空间 } Stack::Stack(int s) { size = s; top = -1; data = new char[size]; //根据指定的大小分配栈的内存空间 } //析构函数 Stack::~Stack() { delete[]data; //内存回收--主动去实现内存的释放。 } void Stack::push(char ch) { //当堆栈是满时,丢出异常对象 if (isFull()) throw Full(); else data[++top] = ch; } char Stack::getTop() //成员函数:获得栈顶元素(不出栈) { if (isEmpty()) { return -1; } return data[top]; } bool Stack::isFull() //成员函数:栈是否为满 { return (top == (size - 1)); } bool Stack::isEmpty() //成员函数:栈是否为空 { return (top == -1); } char Stack::pop() //成员函数:出栈并返回栈顶元素 { //当堆栈是空时,丢出异常对象 if (isEmpty()) throw Empty(); else return data[top--]; //先出栈,top再自减 } void Stack::setNull() //成员函数:设置栈为空 { top = -1; } int main() { int i; char ret; char arr[] = { 'a','d','s' ,'4','2' }; Stack sqStack; try{ for (i = 0; i < sizeof(arr)/sizeof(*arr); i++) { sqStack.push(arr[i]); } sqStack.push('b'); } catch (Stack::Full) { cout << "Stack Full" << endl; } try { ret = sqStack.pop(); cout << ret << endl; ret = sqStack.pop(); cout << ret << endl; ret = sqStack.pop(); cout << ret << endl; ret = sqStack.pop(); cout << ret << endl; ret = sqStack.pop(); cout << ret << endl; ret = sqStack.pop(); cout << ret << endl; } catch (Stack::Empty) { cout << "Stack Empty" << endl; } system("pause"); return 0; }



