异常是一种程序控制机制,与函数机制互补。

函数是一种以栈结构展开的上下函数衔接的程序控制系统,异常是另一种控制结构,它可以在出现“意外”时中断当前函数,并以某种机制(类型匹配)回馈给隔代的调用者相关的信息。

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;
}

posted on 2023-01-10 17:48  wshidaboss  阅读(81)  评论(0编辑  收藏  举报