1. tryステートメントのいずれのステートメントも異常でない場合、catchの背後にあるコードブロックが実行されます。
2. tryステートメントに例外をスローするステートメントがあり、以下のcatchブロックに移動して、同じタイプの例外をスローするステートメントブロックを見つけます。
3. tryステートメントは例外をスローしますが、次のcatchステートメントブロックのいずれも例外をキャッチできません。例外が解決されていないため、catchの下のステートメントにジャンプし、プログラムが終了します。
異常な状況をスローします
カスタム例外クラス
例外キャプチャは、C ++で記述されたシーケンシャルスタックを最適化します
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
const int MAX = 1024;
class stack
{
private:
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;
data = new void*[MAX];
}
stack::stack(int size)
{
cout << "有参构造函数调用" << endl;
this->size = size;
top = -1;
data = new void*[size];
}
stack::~stack()
{
cout << "析构函数" << endl;;
delete[] data;
}
void stack::push(void* val)
{
if (val == NULL)
return;
if (isFull())
{
throw Full();
}
else
{
data[++top] = val;
}
}
void stack::pop()
{
if (isEmpty())
{
throw Empty();
}
else
{
--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]);
s1.push(&p[2]);
s1.push(&p[2]);
}
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;
}
vs2019コンパイラはエラーになります