• 45.C++中的异常处理


    1.基本语法

    try{

            要运行的代码

    }

    catch(抛出的异常类型){

            捕获异常后进行处理的代码

    1. #include
    2. #include
    3. using namespace std;
    4. int Divide(int a,int b){
    5. if (b == 0){
    6. throw 1;
    7. }
    8. return a / b;
    9. }
    10. int main()
    11. {
    12. int a = 1;
    13. int b = 0;
    14. try{
    15. Divide(a,b);
    16. }
    17. catch(int){
    18. cout<<"函数计算过程中发生异常"<
    19. }

    2.异常严格类型匹配

    1. void TestFunction(){
    2. cout << "开始抛出异常..." << endl;
    3. //throw 10; //抛出int类型异常
    4. //throw 'a'; //抛出char类型异常
    5. //throw "abcd"; //抛出char*类型异常
    6. string ex = "string exception!";
    7. throw ex;
    8. }
    9. int main(){
    10. try{
    11. TestFunction();
    12. }
    13. catch (int){
    14. cout << "抛出Int类型异常!" << endl;
    15. }
    16. catch (char){
    17. cout << "抛出Char类型异常!" << endl;
    18. }
    19. catch (char*){
    20. cout << "抛出Char*类型异常!" << endl;
    21. }
    22. catch (string){
    23. cout << "抛出string类型异常!" << endl;
    24. }
    25. //捕获所有异常
    26. catch (...){
    27. cout << "抛出其他类型异常!" << endl;
    28. }
    29. system("pause");
    30. return EXIT_SUCCESS;
    31. }

     3.异常的跳级处理

            假设A调用B,B调用C,如果C中发生了异常,但是C不想或者忘记处理异常,则C将异常向上抛出,由B处理C中的异常,如果B也不想处理,则由A进行处理

    1. #include
    2. #include
    3. using namespace std;
    4. int Divide(int a,int b){
    5. if (b == 0){
    6. throw 1;
    7. }
    8. return a / b;
    9. }
    10. void test()
    11. {
    12. int a = 1;
    13. int b = 0;
    14. try{
    15. Divide(a,b);
    16. }
    17. catch(int){
    18. //cout<<"函数计算过程中发生异常"<
    19. throw; //直接写个throw,就可以将异常继续向上抛出
    20. }
    21. }
    22. int main()
    23. {
    24. try{
    25. test();
    26. }
    27. catch(int){
    28. cout<<"函数计算过程中发生异常"<
    29. }
    30. }

    4.自定义异常类 

    1. #include
    2. #include
    3. using namespace std;
    4. class MyException
    5. {
    6. public:
    7. void Dy() {
    8. cout << "发生异常" << endl;
    9. }
    10. };
    11. int Divide(int a, int b) {
    12. if (b == 0) {
    13. //第一种方式:创建匿名对象并抛出(推荐)
    14. throw MyException();
    15. //第二种方式:创建异常类对象并抛出
    16. MyException p;
    17. throw p;
    18. }
    19. return a / b;
    20. }
    21. int main()
    22. {
    23. int a = 10;
    24. int b = 0;
    25. try {
    26. Divide(a,b);
    27. }
    28. catch (MyException e) {
    29. e.Dy();
    30. }
    31. system("pause");
    32. }

     

    总结:

    1. 若有异常则通过throw操作创建一个异常对象并抛出。
    2. 将可能抛出异常的程序段放到try块之中。
    3. 如果在try段执行期间没有引起异常,那么跟在try后面的catch字句就不会执行。
    4. catch子句会根据出现的先后顺序被检查,匹配的catch语句捕获并处理异常(或继续抛出异常)
    5. 如果匹配的处理未找到,则运行函数terminate将自动被调用,其缺省功能调用abort终止程序。
    6. 处理不了的异常,可以在catch的最后一个分支,使用throw,向上抛。(跳级处理)

            c++异常处理使得异常的引发和异常的处理不必在一个函数中,这样底层的函数可以着重解决具体问题,而不必过多的考虑异常的处理。上层调用者可以在适当的位置设计对不同类型异常的处理。

     

  • 相关阅读:
    Canvas绘制矢量图问题,怎么去掉不是完整的矩形
    Zookeeper:Mac通过Docker安装Zookeeper集群
    【图论】SPFA求负环
    如何能提高虚拟机上下载Hadoop压缩包的下载速度
    Java 插入公式到PPT幻灯片
    重磅发布|博睿数据IT运维最佳实践白皮书
    GIS数据获取:气象数据免费下载网站
    这个好玩又实用的jupyter插件我真的爱了
    POST请求
    centos 7.9 安装python 3.10的tls问题,
  • 原文地址:https://blog.csdn.net/qq_41583263/article/details/127833809