• C++:异常、异常的处理方法、C++常用标准异常


    关键字:try、catch、throw

    程序运行时常会碰到一些异常情况,例如:

      - 做除法的时候除数为 0;

      - 用户输入年龄时输入了一个负数;

      - 用 new 运算符动态分配空间时,空间不够导致无法分配;

      - 访问数组元素时,下标越界;

      - 打开文件读取时,文件不存在

      这些异常情况,如果不能发现并加以处理,很可能会导致程序崩溃.

      所谓"处理":

    1.可以是给出错误提示信息,然后让程序沿一条不会出错的路径继续执行;

    2.也可能是不得不结束程序,但在结束前做一些必要的工作,如将内存中的数据写入文件,关闭打开的文件,释放动态分配的内存空间等

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. int n1 = 12;
    7. int n2 = 0;
    8. int n3 = 9;
    9. //n3 = n1/n2;
    10. vector<int> v1;
    11. v1.push_back(4);
    12. v1.push_back(6);
    13. try
    14. {
    15. v1.at(1);
    16. }
    17. catch(out_of_range) //常用标准异常
    18. {
    19. cout << "访问越界" << endl;
    20. cout << "range: " << "0" << "~" << v1.size()-1 << endl;
    21. }
    22. catch(...)
    23. {
    24. cout << "out of range error" << endl;
    25. }
    26. cout << n3 << endl;
    27. return 0;
    28. }

    处理方法:

      C++ 通过 throw 语句和 try...catch 语句实现对异常的处理

      throw: 当问题出现时,程序会抛出一个异常.

      catch: 通过异常处理程序捕获异常.

      try: 可能出现异常的代码. 它后面通常跟着一个或多个catch块

    throw:该语句拋出一个异常,异常是一个表达式,其值的类型可以是基本类型,也可以是类

         try...catch 语句的语法如下:

         try {

            语句组

         }

         catch(异常类型) {

            异常处理代码

         }

         catch(异常类型) {

            异常处理代码

         }

         catch至少有一个.如果要匹配任意类型,则用catch(...) 一般用到最后位置

              try...catch 语句的执行过程是:

                1、执行 try 块中的语句,如果执行的过程中没有异常拋出,则不会执行任何catch语句

                2、如果 try 块执行的过程中拋出了异常,那么拋出异常后立即跳转到第一个“异常类型”和拋出的异常类型匹配的 catch 块中执行(称作异常被该 catch 块“捕获”)

                3、执行完后再跳转到最后一个 catch 块后面继续执行函数中抛出异常:如果函数内部自己处理了异常try…catch,这个异常就不会抛给调用者;则函数调用后面的代码继续运行。但是如果函数只是抛出异常没有处理,则异常抛给调用者,此函数结束,调用者也去捕获异常了,处理完异常后执行catch之后的代码。

    1. #include
    2. using namespace std;
    3. class Person
    4. {
    5. public:
    6. void setAge(int age)
    7. {
    8. if(age < 0 || age > 150)
    9. {
    10. //throw -1;
    11. p_age = 0;
    12. throw "error!!age range is(0~150)";
    13. }
    14. cout << "setage ok" << endl;
    15. p_age = age;
    16. }
    17. void setNum(int num)
    18. {
    19. try
    20. {
    21. if(num < 0)
    22. {
    23. throw "ERROR!!!!num can't < 0";
    24. }
    25. }
    26. catch(const char *err_msg)
    27. {
    28. num = 0;
    29. cout << err_msg << endl;
    30. }
    31. cout << "num: " << num << endl;
    32. p_num = num;
    33. }
    34. int getAge(void)
    35. {
    36. return p_age;
    37. }
    38. private:
    39. string p_name;
    40. int p_age;
    41. int p_num;
    42. };
    43. void test01()
    44. {
    45. Person p1;
    46. try
    47. {
    48. p1.setAge(200);
    49. }
    50. catch(int &err_num)
    51. {
    52. cout << err_num << endl;
    53. }
    54. catch(const char *str)
    55. {
    56. cout << str << endl;
    57. }
    58. catch(...)
    59. {
    60. cout << "other error!!!" << endl;
    61. }
    62. cout << p1.getAge() << endl;
    63. }
    64. void test02()
    65. {
    66. Person p2;
    67. p2.setNum(-2);
    68. }
    69. int main()
    70. {
    71. test02();
    72. return 0;
    73. }

    C++常用标准异常

    bad_cast

        在用 dynamic_cast 进行从多态基类对象(或引用)到派生类的引用的强制类型转换时,如果转换是不安全的,则会拋出此异常

    bad_alloc

        在用 new 运算符进行动态内存分配时,如果没有足够的内存,则会引发此异常

    out_of_range

        用 vector 或 string 的 at 成员函数根据下标访问元素时,如果下标越界,则会拋出此异常

  • 相关阅读:
    单元测试效率优化:为什么要对程序进行测试?测试有什么好处?
    [附源码]Python计算机毕业设计高校教室申请管理系统
    Class类、反射与代理
    创宇区块链 | 6 月安全月报
    QCustomPlot的下载和使用
    用批处理连续ping一个ip段
    CSS语法及其选择器
    关于Linux Shell 脚本的制作
    java多线程
    UI遍历的初步尝试
  • 原文地址:https://blog.csdn.net/qq_63626307/article/details/126842369