1. 如果try语句里面的语句都没有出现异常,就会执行catch后面的代码块
2.try语句里面存在语句抛出异常,会去下面的catch块中寻找抛出异常类型相同的语句块
3. try语句抛出异常,但是下面的catch语句块中没有一个能够捕获该异常,那么会跳转到catch下面的语句,造成程序的终止,因为异常没有被解决
会丢出异常的情况
自定义异常类
异常捕获优化c 写的顺序栈
代码语言:javascript复制#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
//定义栈的最大值常量
const int MAX = 1024;
//c 实现顺序栈
class stack
{
private:
//用一个void**的指针指向一个存放void*类型指针的数组
void** data; //用来指向栈的数组
int size; ///栈的大小
int top; //栈顶:当前栈内元素个数
public:
stack(); //无参构造
stack(int size);//有参构造
~stack();//析构函数
void push(void* val);//入栈
void pop();//出栈
void* getTop();//获得栈顶元素
bool isEmpty();//栈是否为空
bool isFull();//栈是否已满
void setNull();//设置栈为空
//定义异常内部类(类嵌套类)
class Empty{};
class Full{};
};
stack::stack()
{
cout << "无参构造函数调用" << endl;
size = MAX; //大小为最大
top = -1;//栈初始化时没有元素
//该数组里面存放的是void*指针
data = new void*[MAX];//缺省构造函数分配最大内存空间
}
stack::stack(int size)
{
cout << "有参构造函数调用" << endl;
this->size = size;//用户指定大小
top = -1;//初始化时没有元素
//该数组里面存放的是void*指针
data = new void*[size];//有参构造函数用户指定大小
}
stack::~stack()
{
cout << "析构函数" << endl;;
delete[] data; //内存回收
}
void stack::push(void* val)
{
if (val == NULL)
return;
//入栈:尾插
//每次入栈的时候先判断栈是否已满
//当堆栈为满的时候,丢出Full异常
if (isFull())
{
//匿名函数对象
throw Full();
}
else
{
//更新top的位置,插入数据后top的值就是当前栈中元素的个数
data[ top] = val;
}
//如果栈满了,可以用异常捕获的操作
}
void stack::pop()
{
//如果栈为空,丢出Empty异常
if (isEmpty())
{
//丢出Empty()的匿名函数对象
throw Empty();
}
else
{
//先返回当前出栈的元素,再将top当前栈元素的数量减一
--top;
}
}
void* stack::getTop()
{
if (!isEmpty())
{
return data[top];
}
return NULL;
}
bool stack::isFull()
{
if (top 1==size)
return true;
return false;
}
bool stack::isEmpty()
{
if (top == -1)
return true;
return false;
}
void stack::setNull()
{
top = -1;
}
//测试代码--------------------------------
class person {
public:
string name;
int age;
};
void test()
{
//测试
person p[3] = { {"大忽悠",19},{"小朋友",19},{"大猪头",18} };
//初始化栈
stack s1(3);
//入栈
try {
s1.push(&p[0]);
s1.push(&p[1]);
//此时栈内只能放下两个元素,那么因为可以对异常进行捕获
//所以当要放入第三个元素的时候,会引起异常,去到下面的catch块中寻找对应的捕获类型
s1.push(&p[2]);
//当还要插入第四个元素时,因为插入第三个元素时,已经抛出异常,所以语句3下面的语句不会执行
s1.push(&p[2]);
}
//catch(异常类型),异常类型就是定义的异常内部类的类名
catch (stack::Full)
{
cout << "FULL!!" << endl;
}
try
{
//返回栈顶元素进行输出
person* p1 = (person*)s1.getTop();
cout << "姓名: " << p1->name << " 年龄:" << p1->age << endl;
s1.pop();
//返回栈顶元素进行输出
person* p2 = (person*)s1.getTop();
cout << "姓名: " << p2->name << " 年龄:" << p2->age << endl;
s1.pop();
//返回栈顶元素进行输出
person* p3 = (person*)s1.getTop();
cout << "姓名: " << p3->name << " 年龄:" << p3->age << endl;
s1.pop();
//返回栈顶元素进行输出
person* p4 = (person*)s1.getTop();
cout << "姓名: " << p4->name << " 年龄:" << p4->age << endl;
s1.pop();
}
catch (stack::Empty)
{
cout << "Empty!!" << endl;
}
}
int main()
{
test();
system("pause");
return 0;
}