面向对象入门(四十八)异常接口声明
异常接口声明也称为抛出列表, 是函数界面的一部分, 一方面显式的给出了一个函数抛出异常的界面, 一方面限制了函数抛出异常的类型.
通过异常接口声明可以知道调用该函数需要捕获和处理哪些异常.
语法:
1 指定异常
<返回类型> <函数名>(<形参表>)throw(T1, T2, ..., Tn);
这种异常声明方式指定该函数可以抛出类型为T1, T2, ..., Tn的异常和其子类型的异常. 若在函数内抛出其他类型异常, 则无法捕获调用
catch()块, 系统将调用abort()函数终止程序
通过异常接口声明可以知道调用该函数需要捕获和处理哪些异常.
语法:
1 指定异常
<返回类型> <函数名>(<形参表>)throw(T1, T2, ..., Tn);
这种异常声明方式指定该函数可以抛出类型为T1, T2, ..., Tn的异常和其子类型的异常. 若在函数内抛出其他类型异常, 则无法捕获调用
catch()块, 系统将调用abort()函数终止程序
2 不抛出异常
<返回类型> <函数名>(<形参表>)throw();
这种异常类型声明表示该函数不抛出任何异常
<返回类型> <函数名>(<形参表>)throw();
这种异常类型声明表示该函数不抛出任何异常
3 抛出任意类型的异常
<返回类型> <函数名>(<形参表>);
不使用throw关键字声明, 表示该函数可以抛出任意类型的异常
<返回类型> <函数名>(<形参表>);
不使用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; } }
路漫漫其修远兮,吾将上下而求索。