🤖 AI文章摘要 gemini-2.0-flash-lite

这篇文章介绍了C++异常处理机制。C++通过try-catch语句来处理异常,try块中包含可能引发异常的代码,catch块用于捕获和处理异常。当被调函数抛出异常时,会先释放栈上的数据对象,然后主调函数通过catch捕获异常,并根据异常类型匹配相应的处理代码。异常变量用于存储异常信息,传递给catch块。异常变量的传递方式和多态特性在异常处理中也有特殊的应用,例如,异常类可以存在继承关系,子类的catch语句应写在父类之前。

异常概述

C++异常

  • 语法实现: C++通过try 来运行可能产生异常的代码, 用catch来捕获代码抛出的异常变量
    • 主调函数中: try{ 引发异常的代码; }catch(异常变量类型 可选:接收异常变量){异常处理;} catch(异常变量类型 可选:接收异常变量){异常处理2;} … catch(…){异常处理;}
    • 被调函数中: throw 异常变量
  • 异常的处理过程
    • 第一步: 主调函数通过try尝试调用函数
    • 第二步: 当被调函数 throw异常变量 之前, 会先释放从try到throw异常变量之间建立的所有数据对象(栈解旋), 然后throw异常变量.
    • 第三步: 主调函数通过catch捕获异常变量, 并根据异常变量的类型匹配异常处理代码(所以异常变量可以不用填).
      • 若存在匹配的异常处理代码, 则进入异常处理代码完成异常处理. 若异常处理失败则可以继续向上抛出此异常
      • 若不存在匹配的异常处理代码, 则自动向上抛出此异常直到匹配异常处理代码. 若异常上升到main函数仍未解决则程序终止运行.
  • 异常变量的接收: 异常变量用来存储引发异常的位置或原因, 为异常处理代码提供参考.
    • 若被调函数的异常变量是以值或引用方式返回, 和普通函数不同的是编译器不会释放这个异常变量直到异常处理结束.
    • 若被调函数的异常变量是以指针方式返回, 和普通函数一样编译器会释放这个异常变量, 可以通过开辟到堆上返回指针解决, 但要注意释放内存!!!
  • 异常与多态: C++的异常类型可以存在继承与多态关系, 但子类必须写在父类的前面. 例如: class exception_BaseClass{ virtual printError(){} } class exceptions_nullptr :public exception_BaseClass{ virtual printError(){cout « “空指针异常” «endl; }; } void test(int * p){if(NULL == p ){throw exception_nullptr();}} int main(){ try{test();}catch(exception_BaseClass e){e.printError();//根据传入的类型调用相应的重写函数}}