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   新西兰程序员  阅读(83)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2018-07-17 ASP.NET MVC中的ActionFilter介绍学习
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示