面向对象入门(四十八)异常接口声明

异常接口声明也称为抛出列表, 是函数界面的一部分, 一方面显式的给出了一个函数抛出异常的界面, 一方面限制了函数抛出异常的类型.
通过异常接口声明可以知道调用该函数需要捕获和处理哪些异常.
语法:
1 指定异常
<返回类型> <函数名>(<形参表>)throw(T1, T2, ..., Tn);
这种异常声明方式指定该函数可以抛出类型为T1, T2, ..., Tn的异常和其子类型的异常. 若在函数内抛出其他类型异常, 则无法捕获调用
catch()块, 系统将调用abort()函数终止程序
2 不抛出异常
<返回类型> <函数名>(<形参表>)throw();
这种异常类型声明表示该函数不抛出任何异常
3 抛出任意类型的异常
<返回类型> <函数名>(<形参表>);
不使用throw关键字声明, 表示该函数可以抛出任意类型的异常
 
代码示例:
#include <iostream>
#include <fstream>
#include <time.h>
using namespace std;

/*
异常接口声明也称为抛出列表, 是函数界面的一部分, 一方面显式的给出了一个函数抛出异常的界面, 一方面限制了函数抛出异常的类型.
通过异常接口声明可以知道调用该函数需要捕获和处理哪些异常.
语法:
1 指定异常
<返回类型> <函数名>(<形参表>)throw(T1, T2, ..., Tn);
这种异常声明方式指定该函数可以抛出类型为T1, T2, ..., Tn的异常和其子类型的异常. 若在函数内抛出其他类型异常, 则无法捕获调用
catch()块, 系统将调用abort()函数终止程序

2 不抛出异常
<返回类型> <函数名>(<形参表>)throw();
这种异常类型声明表示该函数不抛出任何异常

3 抛出任意类型的异常
<返回类型> <函数名>(<形参表>);
不使用throw关键字声明, 表示该函数可以抛出任意类型的异常
*/
void test(int) throw(int, char);
void handler(int);
tm now;
ofstream log_67("log_no67.txt", ios::app);
static int exeCount = 0;
int main()
{
    exeCount++;
    
    cout << "program start" << endl;
    int i = 1;
    handler(i);
    i = -1;
    handler(i);
    handler(0);
    cout << "program end" << endl;
    log_67.close();
    return 0;
}

void test(int i) throw(int, char)
{
    if (i > 0) throw i;
    if (i < 0) throw char(i);
    if (i == 0)
    {
        log_67 << "程序运行时刻" << clock() << endl;
        log_67 << "抛出未给定类型的异常, 程序将被终止!" << endl;
        throw double(i);
    }
}

void handler(int i)
{
    try
    {
        test(i);
    }
    catch (int)
    {
        log_67 << "程序运行时刻" << clock() << endl;
        log_67 << "捕获一个int类型异常" << endl;
    }
    catch (char)
    {
        log_67 << "程序运行时刻" << clock() << endl;
        log_67 << "捕获一个char类型异常" << endl;
    }
}

 

posted @ 2020-09-09 15:21  DNoSay  阅读(426)  评论(0编辑  收藏  举报