异常是一种程序控制机制,与函数机制互补。
函数是一种以栈结构展开的上下函数衔接的程序控制系统,异常是另一种控制结构,它可以在出现“意外”时中断当前函数,并以某种机制(类型匹配)回馈给隔代的调用者相关的信息。
1.在异常发生第一现场,抛出异常
void function( ){
//... ...
throw 表达式;
//... ...
}
2.在需要关注异常的地方,捕捉异常
try{
//程序
function();
//程序
} catch(异常类型声明){
//... 异常处理代码 ...
} catch(异常类型 形参){
//... 异常处理代码 ...
} catch(...){ //其它异常类型
//... 异常处理代码 ...
}
注意事项:
1.通过 throw 操作创建一个异常对象并抛掷
2.在需要捕捉异常的地方,将可能抛出异常的程序段嵌在 try 块之中
3.按正常的程序顺序执行到达 try 语句,然后执行 try 块{}内的保护段
4.如果在保护段执行期间没有引起异常,那么跟在 try 块后的 catch 子句就不执
行,程序从 try 块后跟随的最后一个 catch 子句后面的语句继续执行下去
5.catch 子句按其在 try 块后出现的顺序被检查,匹配的 catch 子句将捕获并按
catch 子句中的代码处理异常(或继续抛掷异常)
6.如果没有找到匹配,则缺省功能是调用 abort 终止程序。
提示:处理不了的异常,我们可以在 catch 的最后一个分支,使用 throw 语法,
继续向调用者 throw。
#include <iostream>
#include <stdlib.h>
using namespace std;
#define BUFSIZE 1024
//实现文件的二进制拷贝
int copyfile2(const char* dest, const char* src) {
FILE* fp1 = NULL, * fp2 = NULL;
//rb只读方式打开一个二进制文件,只允许读取数据
fopen_s(&fp1, src, "rb");
if (fp1 == NULL) {
throw new string("字符串异常");
}
////wb只写方式打开或新建一个二进制文件,只允许写数据
fopen_s(&fp2, dest, "wb");
if (fp2 == NULL) {
return -2;
}
char buffer[BUFSIZE];
int readlen = 0, writelen = 0;
//如果读到数据,则大于0
while ((readlen == fread(buffer, 1, BUFSIZE, fp1)) > 0) {
writelen = fwrite(buffer,1,readlen,fp2);
if (readlen != writelen) {
return -3;
}
}
fclose(fp1);
fclose(fp2);
return 0;
}
int copyfile1(const char* dest, const char* src) {
return copyfile2(dest,src);
}
int main() {
int ret = 0;
try{
ret = copyfile1("E:/C++project/dest.txt", "E:/C++project/src.txt");
}
catch (string *error) {
printf("捕捉到字符串异常:%s\n",error->c_str());
delete error;
}
catch (int error) {
printf("整型出现异常了!\n");
}
if (ret != 0) {
switch (ret) {
case -1:
printf("打开源文件失败!\n");
break;
case -2:
printf("打开目标文件失败!\n");
break;
case -3:
printf("拷贝文件时失败!\n");
break;
default:
printf("出现未知失败!\n");
break;
}
}
system("pause");
return 0;
}
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
#define BUFSIZE 1024
//实现文件的二进制拷贝
int copyfile2(char* dest, char* src) {
FILE* fp1 = NULL, * fp2 = NULL;
//通过 throw 操作创建一个异常对象并抛掷
throw 0.01f;
//rb 只读方式打开一个二进制文件,只允许读取数据
fopen_s(&fp1, src, "rb");
if (fp1 == NULL) {
throw new string("文件不存在");
}
//wb 以只写的方式打开或新建一个二进制文件,只允许写数据。
fopen_s(&fp2, dest, "wb");
if (fp2 == NULL) {
throw - 2;
}
char buffer[BUFSIZE];
int readlen, writelen;
//如果读到数据,则大于 0
while ((readlen = fread(buffer, 1, BUFSIZE, fp1)) > 0) {
writelen = fwrite(buffer, 1, readlen, fp2);
if (readlen != writelen) {
throw - 3;
}
}
fclose(fp1);
fclose(fp2);
return 0;
}
int copyfile1(char* dest, char* src) {
try {
copyfile2(dest, src);
}
catch (float e) {
//throw ;
printf("copyfile1 - catch ...%f\n",e);
//提示:处理不了的异常,我们可以在 catch 的最后一个分支,使用 throw语法,继续向调用者 throw。
throw;
}
return 0;
}
int main() {
int ret = 0;
//在需要捕捉异常的地方,将可能抛出异常的程序段嵌在 try 块之中
//按正常的程序顺序执行到达 try 语句,然后执行 try 块{}内的保护段
//如果在保护段执行期间没有引起异常,那么跟在 try 块后的 catch 子句就
//不执行,程序从 try 块后跟随的最后一个 catch 子句后面的语句继续执行下去
try {//保护段
printf("开始执行 copyfile1...\n");
//ret = copyfile1("E:/C++project/20230110/20230110/dest.txt", "E:/C++project/20230110/20230110/src.txt");
ret = copyfile1("E:/C++project/20230110/20230110/dest.txt","E:/C++project/20230110/20230110/src.txt");
printf("执行 copyfile1 完毕\n");
//catch 子句按其在 try 块后出现的顺序被检查,匹配的 catch 子句将捕获并按 catch 子句中的代码处理异常(或继续抛掷异常)
}
catch (int error) {
printf("整型出现异常啦!%d\n", error);
}
catch (string* error) {
printf("捕捉到字符串异常:%s\n", error->c_str());
delete error;
}
catch (float error) {
printf("浮点型出现异常啦!%f\n", error);
}
catch (...) {
printf("catch ...\n");
}
//如果没有找到匹配,则缺省功能是调用 abort 终止程序。
system("pause");
return 0;
}