首先 在程序文件夹创建test.dat文件 如果这个文件里的数据不等于我规定的,那么就抛出异常
话不多说 直接亮代码
/*
异常机制
基本格式: try{
函数代码; // 这个范围为保护段
}
catch(类型 [类型名]){
处理语句;
}
catch(类型 [类型名]){
处理语句;
}
catch(...){ ...表示可以接受任何异常类型
处理语句;
}
0)异常不管你执行了多少个函数或者递归了多少次 仍然可以直接把错误抛到'try'处
1)使用关键字 throw 抛出异常
2)排他形执行,只执行一个异常处理(catch)
3)不能存在相同类型的异常变量 catch(float f1),catch(float f2);
4)如果没有捕捉,则程序直接崩掉 (abort终止函数)
5)如果出现异常会终止保护段的代码
程序清单5.0演示了该行为
*/
// 5.0
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void openFire()
{
string name("0");
ifstream os;
os.open("test.dat", ios::in);
os >> name;
if (name != "#X1777")
throw 0.01f;
else
cout << "openFire函数成功读取机密文件!" << endl;
}
int main1(void)
{
try {
cout << "程序进入保护段..." << endl;
openFire();
cout << "程序运行结束";
}
catch (float fl) {
cout << "出现异常!" << fl;
}
catch (...) {
cout << "捕捉到未处理的异常类型!" << endl;
}
return 0;
}
/*
多重异常处理
一个函数调用另一个函数 另一个函数抛出异常被"调用函数"接受并进行处理,
如果该"调用函数"不想处理可以抛至上一个"调用函数"
1)如果"调用函数"没匹配到相应类型的异常则会抛到上一个try
2)处理了,程序就继续执行
程序清单5.1演示了该效果
*/
// 5.1
void openFire2()
{
string name("0");
ifstream os;
os.open("test.dat", ios::in);
os >> name;
if (name != "#X1778") {
throw 32; // throw "32";throw 0.01f;
}
else
cout << "openFire函数成功读取机密文件!" << endl;
}
void play()
{
try {
openFire2();
}
catch (int in)
{
// 这里也可以抛 throw
cout << "出现异常" << in << " paly函数已经处理异常!" << endl;
}
}
int main2(void)
{
try {
cout << "程序进入保护段..." << endl;
play();
cout << "程序运行结束";
}
catch (float fl) {
cout << "出现异常!" << fl;
}
catch (...) {
cout << "捕捉到未经处理的异常类型!" << endl;
}
return 0;
}
/*
异常处理接口声明
1)对于异常声明 在函数声明时补充异常声明
2)有了接口声明只能抛出声明的异常类型
3)如果不想抛异常可以写 throw()
4)vc++编译器貌似不完全支持该异常规范
程序清单5.2演示了该内容
*/
// 5.2
void openFire3() throw(int,float,string*)
{
string name("0");
ifstream os;
os.open("test.dat", ios::in);
os >> name;
if (name != "#X1778") {
throw 0.01f;// throw "32";
}
else
cout << "openFire函数成功读取机密文件!" << endl;
}
int main3(void)
{
try {
cout << "程序进入保护段..." << endl;
openFire3();
cout << "程序运行结束";
}
catch (float fl) {
cout << "出现异常!" << fl;
}
catch (...) {
cout << "捕捉到未经处理的异常类型!" << endl;
}
return 0;
}
什么 还没看够? 关注我随时更新C++编程