室友一把王者的时间我干翻了异常机制

首先 在程序文件夹创建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++编程 

猜你喜欢

转载自blog.csdn.net/qq_46530073/article/details/122177979