【C++】异常处理 ⑤ ( 异常类型 | 传统 C 语言中的异常处理 | C++ 异常处理 - 抛出 int 类型异常 | 捕获异常类型 / 异常变量 | C++ 异常处理 - 抛出指针类型异常 )

超、凢脫俗 2024-02-17 12:37 170阅读 0赞

文章目录

  • 一、传统异常处理
    • 1、C 语言中的异常处理
    • 2、代码示例 - 传统异常处理
  • 二、C++ 异常处理 - 抛出 int 类型异常
    • 1、C++ 异常处理
    • 2、C++ 异常接收方式
    • 3、捕获异常类型 / 异常变量
    • 4、代码示例 - 抛出 / 捕获 int 类型异常
  • 三、C++ 异常处理 - 抛出指针类型异常
    • 1、抛出 char* 字符串常量 类型异常
    • 2、代码示例 - 抛出 char* 字符串常量 类型异常

一、传统异常处理


1、C 语言中的异常处理

传统的 C 语言中 错误处理 , 是通过返回不同的 int 类型值进行的 , 如 :

  • 执行成功返回 0 ;
  • 情况一 执行失败 , 返回 1 ;
  • 情况二 执行失败 , 返回 2 ;

2、代码示例 - 传统异常处理

如下代码示例中 , 实现一个字符串拷贝功能 , 拷贝时可能遇到各种错误 , 如 : 源字符串 不符合要求 , 目的字符串不符合要求 , 拷贝过程出错等 ;

传统的 C 语言处理方式就是 : 返回 int 类型返回值 , 函数执行成功返回 0 , 不同的失败情况返回不同的返回值 ;

代码示例 :

  1. #include "iostream"
  2. using namespace std;
  3. // 拷贝函数
  4. // 返回值 int 类型的错误码
  5. int my_strcpy(char* to, char* from) {
  6. if (from == NULL)
  7. {
  8. // 源字符串出错
  9. return 1;
  10. }
  11. if (to == NULL)
  12. {
  13. // 目标字符串出错
  14. return 2;
  15. }
  16. // 拷贝前检查条件
  17. if (*from == 'J')
  18. {
  19. // 源字符串不能是 J 开头的
  20. return 3;
  21. }
  22. // 逐个字节拷贝字符
  23. while (*from != '\0')
  24. {
  25. *to = *from;
  26. to++;
  27. from++;
  28. }
  29. *to = '\0';
  30. return 0;
  31. }
  32. int main() {
  33. // 字符串拷贝函数返回值
  34. int ret = 0;
  35. // 源字符串
  36. char str1[] = "Tom";
  37. // 目的字符串
  38. char str2[32] = {
  39. 0};
  40. // 调用字符串拷贝函数
  41. ret = my_strcpy(str2, str1);
  42. // 根据不同的返回值进行不同的错误处理
  43. switch (ret)
  44. {
  45. case 0:
  46. cout << "拷贝成功 : str2 : " << str2 << endl;
  47. break;
  48. case 1:
  49. cout << "源字符串出错" << endl;
  50. break;
  51. case 2:
  52. cout << "目的字符串出错" << endl;
  53. break;
  54. case 3:
  55. cout << "拷贝过程出错" << endl;
  56. break;
  57. default:
  58. cout << "位置错误" << endl;
  59. break;
  60. }
  61. // 控制台暂停 , 按任意键继续向后执行
  62. system("pause");
  63. return 0;
  64. };

执行结果 :

  1. 拷贝成功 : str2 : Tom
  2. Press any key to continue . . .

在这里插入图片描述

二、C++ 异常处理 - 抛出 int 类型异常


1、C++ 异常处理

在 C++ 中的 错误处理 可以不占用 返回值 位置 , 使用 异常处理 机制 , 在函数中 抛出 指定类型 的异常 进行处理 ;

2、C++ 异常接收方式

抛出异常后 , 捕获异常 , 接收异常有很多种方式 ;

  • 可以按照 普通类型 接收异常 ,
  • 可以按照 引用类型 接收异常 ,
  • 可以按照 指针类型 接收异常 ;

3、捕获异常类型 / 异常变量

在 catch 分支中 , 捕获异常时 , 可以写 异常变量 , 也可以不写 ;

  • 不写异常变量 : 只捕获异常类型 , 如 :

    catch(int)

表示捕获 int 类型的异常 , 但是如果这么写了 , 只能拦截到异常 , 知道 抛出了一个 int 类型的异常 , 不能访问异常的具体内容 ;

  • 写异常变量 : 可以访问异常变量 , 知道抛出的异常值是多少 , 如 :

    catch(int e)

通过上面的 变量 e , 可以知道抛出的异常的具体 int 数值是多少 ;

4、代码示例 - 抛出 / 捕获 int 类型异常

代码示例 :

  1. #include "iostream"
  2. using namespace std;
  3. // 拷贝函数
  4. // 使用 throw 关键字抛出 int 类型的异常
  5. void my_strcpy(char* to, char* from) throw(int) {
  6. if (from == NULL)
  7. {
  8. // 源字符串出错
  9. throw 1;
  10. }
  11. if (to == NULL)
  12. {
  13. // 目标字符串出错
  14. throw 2;
  15. }
  16. // 拷贝前检查条件
  17. if (*from == 'J')
  18. {
  19. // 源字符串不能是 J 开头的
  20. throw 3;
  21. }
  22. // 逐个字节拷贝字符
  23. while (*from != '\0')
  24. {
  25. *to = *from;
  26. to++;
  27. from++;
  28. }
  29. *to = '\0';
  30. }
  31. int main() {
  32. // 源字符串
  33. char str1[] = "Tom";
  34. // 目的字符串
  35. char str2[32] = {
  36. 0};
  37. try
  38. {
  39. // 调用字符串拷贝函数
  40. my_strcpy(str2, str1);
  41. cout << "拷贝成功 : str2 : " << str2 << endl;
  42. }
  43. // catch 分支中可以写 异常变量 , 也可以不写
  44. // 如果不写 , 则不能访问抛出的 异常对象
  45. catch (int e)
  46. {
  47. // 根据不同的返回值进行不同的错误处理
  48. switch (e)
  49. {
  50. case 1:
  51. cout << "源字符串出错" << endl;
  52. break;
  53. case 2:
  54. cout << "目的字符串出错" << endl;
  55. break;
  56. case 3:
  57. cout << "拷贝过程出错" << endl;
  58. break;
  59. default:
  60. cout << "位置错误" << endl;
  61. break;
  62. }
  63. }
  64. // 控制台暂停 , 按任意键继续向后执行
  65. system("pause");
  66. return 0;
  67. };

执行结果 :

  1. 拷贝成功 : str2 : Tom
  2. Press any key to continue . . .

在这里插入图片描述

三、C++ 异常处理 - 抛出指针类型异常


抛出 / 捕获异常 , 有很多种方式 ;

  • 可以按照 普通类型 抛出 / 捕获异常 ,
  • 可以按照 引用类型 抛出 / 捕获异常 ,
  • 可以按照 指针类型 抛出 / 捕获异常 ;

上一个章节 演示了 抛出 / 捕获 普通类型 异常 , 本章节介绍 抛出 / 捕获 引用类型 异常 ;

1、抛出 char* 字符串常量 类型异常

抛出 char* 字符串 指针类型异常 操作 , 与 抛出 普通变量类型的异常 操作相同 ;

字符串常量 存储在 符号表 中 , 因此可以在所有的函数之间传递 ;

抛出 / 捕获 异常 关键代码如下 :

  • 异常接口声明 : 注意 字符串常量 的类型为 const char* ;

    void my_strcpy(char to, char from) throw(const char*)

  • 抛出 异常 : 直接抛出 字符串常量 , 不要分配内存 ;

    throw “源字符串出错”;

  • 捕获 异常 : 捕获 字符串常量 异常时 , 不要忘了使用 const 修饰指针指向的数据 ;

    catch (const char* e)

2、代码示例 - 抛出 char* 字符串常量 类型异常

代码示例 :

  1. #include "iostream"
  2. using namespace std;
  3. // 拷贝函数
  4. // 使用 throw 关键字抛出 字符串类型的异常
  5. void my_strcpy(char* to, char* from) throw(const char*) {
  6. if (from == NULL)
  7. {
  8. // 源字符串出错
  9. throw "源字符串出错";
  10. }
  11. if (to == NULL)
  12. {
  13. // 目标字符串出错
  14. throw "目标字符串出错";
  15. }
  16. // 拷贝前检查条件
  17. if (*from == 'J')
  18. {
  19. // 源字符串不能是 J 开头的
  20. throw "源字符串不能是 J 开头";
  21. }
  22. // 逐个字节拷贝字符
  23. while (*from != '\0')
  24. {
  25. *to = *from;
  26. to++;
  27. from++;
  28. }
  29. *to = '\0';
  30. }
  31. int main() {
  32. // 源字符串
  33. char str1[] = "Jerry";
  34. // 目的字符串
  35. char str2[32] = {
  36. 0};
  37. try
  38. {
  39. // 调用字符串拷贝函数
  40. my_strcpy(str2, str1);
  41. cout << "拷贝成功 : str2 : " << str2 << endl;
  42. }
  43. // catch 分支中可以写 异常变量 , 也可以不写
  44. // 如果不写 , 则不能访问抛出的 异常对象
  45. catch (const char* e)
  46. {
  47. cout << "出现异常 : " << e << endl;
  48. }
  49. // 控制台暂停 , 按任意键继续向后执行
  50. system("pause");
  51. return 0;
  52. };

执行结果 :

  1. 出现异常 : 源字符串不能是 J 开头
  2. Press any key to continue . . .

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,170人围观)

还没有评论,来说两句吧...

相关阅读