【C++】异常处理 ② ( 异常捕获类型 | 异常捕获机制 - 严格匹配异常类型 | 未知异常捕获 - 不知道异常类型 )

痛定思痛。 2024-02-17 12:26 179阅读 0赞

文章目录

  • 一、异常捕获机制 - 严格匹配异常类型
    • 1、异常捕获机制 - 严格匹配异常类型
    • 2、代码示例 - 异常捕获严格匹配异常类型
  • 二、异常捕获机制 - 未知异常捕获
    • 1、未知异常捕获 - 不知道异常类型
    • 2、代码示例 - 未知异常捕获

一、异常捕获机制 - 严格匹配异常类型


1、异常捕获机制 - 严格匹配异常类型

异常机制 与 函数机制 是 互不干涉的两个系统 ,

  • 函数参数 的 匹配机制 是 形参 与 实参 进行匹配 ,
  • 异常捕获 的 匹配机制 是 基于 抛出的异常类型进行匹配 ;

注意 区分 异常捕获 与 函数参数匹配 , 异常捕获 匹配的是 抛出的异常类型 与 catch 分支中要捕获的异常类型 ;

异常捕获 , 严格按照类型进行匹配 ,

  • 如 : 在 catch 分支 中 捕获 short / int 类型的异常 , 是无法拦截到 char 类型异常的 ;

2、代码示例 - 异常捕获严格匹配异常类型

代码示例 :

  1. #include "iostream"
  2. using namespace std;
  3. // 1. 在 函数 中 抛出异常
  4. void fun(int a) {
  5. if (a == 0) {
  6. // 抛出一个 char 类型的异常
  7. throw 'A';
  8. }
  9. }
  10. int main() {
  11. // 2. 捕获并处理异常
  12. try
  13. {
  14. // 调用可能产生异常的函数
  15. fun(0);
  16. }
  17. // 抛出 char 类型的异常 , 捕获 int 类型异常是无法拦截到异常的
  18. // 此处程序会崩溃
  19. catch (int e)
  20. {
  21. cout << "捕获到异常 : " << e << endl;
  22. }
  23. // 控制台暂停 , 按任意键继续向后执行
  24. system("pause");
  25. return 0;
  26. };

执行结果 :

0x75D5D8A2 处(位于 HelloWorld.exe 中)有未经处理的异常: Microsoft C++ 异常: char,位于内存位置 0x0077F73B 处。

在这里插入图片描述

二、异常捕获机制 - 未知异常捕获


1、未知异常捕获 - 不知道异常类型

上面的案例中 , 抛出了 char 类型的异常 ‘A’ , 在 catch 分支中拦截的是 int 类型的异常 ,

也就是 没有拦截到 抛出的 char 类型异常 , 该函数是 main 函数 , 已经是最顶层的函数 ,

main 函数中 , 如果出现异常没有处理 , 应用程序直接崩溃 ;

应对该问题的方法是 , 拦截 未知异常 类型的 异常 ,

要捕获未知类型的异常 , 可以 使用 catch ( … ) 分支 , 这个catch块可以匹配任何类型的异常 , 可以拦截所有类型的异常 ,

因此无论try块中抛出什么类型的异常,都会被这个catch块捕获并处理。

使用 catch ( … ) 分支 , 可以拦截所有类型的异常 , 相当于 Java 中的 Exception 异常父类 ;

下面的代码 , 可以捕获一切类型的异常 ;

  1. // 捕获一切类型异常
  2. try
  3. {
  4. }
  5. catch ( ... )
  6. {
  7. cout << "捕获到未知类型异常 ... "<< endl;
  8. }

2、代码示例 - 未知异常捕获

代码示例 : 在下面的示例中 ,

  • 首先 , 使用 throw 关键字 抛出了一个 char 类型的异常 ;
  • catch (int e) 代码块中 , 可以捕获 int 类型异常 , 不能捕获 char 类型的异常 ;
  • 由于 catch 代码块 中没有明确捕获 char 类型的异常 , 该 抛出的 char 类型的异常 将被第 2 个catch ( … ) 块捕获 , 并打印相关信息 ;

    include “iostream”

    using namespace std;

    // 1. 在 函数 中 抛出异常
    void fun(int a) {

    1. if (a == 0) {
    2. // 抛出一个 char 类型的异常
    3. throw 'A';
    4. }

    }

    int main() {

  1. // 2. 捕获并处理异常
  2. try
  3. {
  4. // 调用可能产生异常的函数
  5. fun(0);
  6. }
  7. // 抛出 char 类型的异常 , 捕获 int 类型异常是无法拦截到异常的
  8. // 此处程序会崩溃
  9. catch (int e)
  10. {
  11. cout << "捕获到异常 : " << e << endl;
  12. }
  13. // 捕获一切未知类型的异常
  14. catch ( ... )
  15. {
  16. cout << "捕获到未知类型异常 ... "<< endl;
  17. }
  18. // 控制台暂停 , 按任意键继续向后执行
  19. system("pause");
  20. return 0;
  21. };

执行结果 :

  1. 捕获到未知类型异常 ...
  2. Press any key to continue . . .

在这里插入图片描述

发表评论

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

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

相关阅读