标准程序库异常
我们使用c++标准库中的异常类,来实现我们之前文件拷贝的代码。
#include <iostream>
#include <stdlib.h>
#include <exception>
#include <ios>
using namespace std;
#define BUFFER_SIZE 1024
// 将一个文件中的内容拷贝到另外一个文件中去
int makeFile(const char* dest, const char* src) {
// 定义文件指针
FILE* fp1 = NULL, * fp2 = NULL;
// 打开文件, 以只读二进制形式打开文件,打开失败返回NULL
fp1 = fopen(src, "rb");
// 判断文件是否成功打开
if (!fp1) {
throw ios_base::failure("源文件打开失败");
}
// 打开文件,以只写二进制形式打开文件,打开失败返回NULL
fp2 = fopen(dest, "wb");
// 判断文件是否成功打开
if (!fp2) {
throw ios_base::failure("目标文件打开失败"); // 返回错误标记,表示目标文件打开失败
}
// 进行文件的拷贝
char buffer[BUFFER_SIZE]; // 1024字节的缓存
int readLen, writeLen; // 每次读取的长度和写入的长度
// 读取的长度大于0,说明有内容可以写入,执行循环体的写入内容
while ((readLen = fread(buffer, 1, BUFFER_SIZE, fp1)) > 0) {
writeLen = fwrite(buffer, 1, readLen, fp2);
// 如果一次写入的长度和读取的长度不等,那么说明写入失败
if (readLen != writeLen) {
throw ios_base::failure("文件写入失败");
}
}
// 关闭文件
fclose(fp1);
fclose(fp2);
return 0; // 一切正常返回0
}
int makeFile2(const char* dest, const char* src) {
int ret;
ret = makeFile(dest, src);
printf("makeFile2 函数被调用");
return ret;
}
int main(void) {
int ret = 0;
try {
ret = makeFile2("dest.txt", "src.txt");
}
catch (exception& error) {
// what()函数返回错误信息
cout << error.what() << endl;
}
system("pause");
return 0;
}
结果:
前面的汉字是我们抛出异常时传入的异常描述信息,后面的英文是编译器添加的异常信息描述。
分析:
1. ios_base::failure类是封装的输入输出流异常问题,并且在头文件ios中,我们对于文件的操作就是输入输出流,所以使用这个异常类。
2. 我们抛出ios_base::failure的匿名对象,传入一个参数,就是对异常信息描述的字符串。
3. 因为这些异常类都继承于父类exception,所以我们在catch中直接使用exception的引用接收信息,然后使用what()函数返回异常信息,并且打印。