C++中的异常处理详细说明

看代码的过程中,经常看到try{}catch{}语句块,而且还经常性的看到这样的语句

try
{
     //保护代码
}
catch(...)
{
    //处理任何异常的代码
}

刚开始我对catch(...)非常困惑,因为C#中并没有这样的用法. 所以,特意来了解学习一下C++中的异常处理方式

通常来说,try{}catch{}块中,try块中的代码我们称之为保护代码,catch中代码为处理(捕获)异常的代码, 还有个关键字throw,是扔出(抛出)异常的代码

throw抛出异常的代码,可以在代码块中的任何位置,任何地方. 比如我们在C++中实现除法运算时,如果除数为0,肯定会抛出异常,如下

double Division(int a, int b)
{
      if(b == 0)
      {
          throw "Division by zero is not allowed"
       }

       return (a/b);
}

一个try块后面,可以跟着多个catch块,意思就是说,这个try块可能抛出多种异常(多个异常),我们可以每个异常有一个对应的catch。 如果你想让catch块能够去处理try块抛出的任何类型的异常,那么就可以使用catch(..)  => 这也就是我在代码中经常看到catch(...)却不知道具体为何意的解释

我们来看一下一个try语句,抛出多种异常的可能性的情况

try
{
//保护代码 } catch(Exception1 e1) //处理捕获第1种类型的异常 { } catch(Exception2 e2) //处理捕获第2种类型的异常 { } ........ catch(ExceptionN eN) //处理捕获第N种类型的异常 { }

我们还是以上面的除法中除数为0的异常作为类子,来看我们的代码写法

#include <iostream>
using namespace std;

double Division(int a, int b)
{
      if(b == 0)
      {
          throw "Division by zero is not allowed"
       }

       return (a/b);
}

int main()
{ 
      int a = 4;
      int b = 0;
     double c = 0;

     try{
          c = Division(a,b);
          cout << c << end1;
      }
      catch(const char* except)
     {
          cout << except <<end1;
     }

      return 0; 
}

 

由于我们在Division函数中抛出的是一个字符串常量类型的异常(const char*类型的异常), 所以,我们在catch块中捕获该异常时,必须使用const char*类型

上面代码编译和执行时,输出  

Division by zero is not allowed


在C++中,定义了一些标准的异常,它们在命名空间std:exception中,我们也可以通过继承和重载std:exception来定义和实现自己的自定义异常。 具体我就不在这里阐述了


posted on 2023-07-17 17:21  新西兰程序员  阅读(60)  评论(0编辑  收藏  举报