全国咨询/投诉热线:400-618-9090

首页技术文章正文

C++ 异常处理【黑马C++培训】

更新时间:2019年08月05日 15时27分46秒 来源:黑马程序员论坛

黑马中级程序员课程


异常是程序在执行期间产生的现象。C++ 异常是指在程序运行时产生的特殊状况,例如尝试除以零的操作。异常提供了一种改变程序控制权的方式。

C++ 异常处理牵涉到三个关键字:try、catch、throw。

throw: 当现象出现时,程序会抛出1个异常。这是通过使用 throw 关键字来完成的。

catch: 在您想着处理现象的地方,通过异常处理程序捕捉异常。catch 关键字用于捕捉异常。

try: try 块中的代码标识将被激活的特定异常。

它后面通常跟着1个或多个 catch 块。假如有个块抛出1个异常,捕捉异常的方法会使用 try 和 catch 关键字。

try 块中放置可能抛出异常的代码,try 块中的代码被称作保护代码。使用 try/catch 语句的语法如下所示:

try

{

   // 保护代码

}catch( ExceptionName e1 )

{

   // catch 块

}catch( ExceptionName e2 )

{

   // catch 块

}catch( ExceptionName eN )

{

   // catch 块

}

如果 try 块在不同的情境下会抛出不同的异常,这个时候可以尝试罗列多个 catch 语句,用于捕获不同类型的异常。

抛出异常

您可以使用 throw 语句在代码块中的任何地方抛出异常。throw 语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型。

以下是尝试除以零时抛出异常的实例:


double division(int a, int b)

{

   if( b == 0 )

   {

      throw "Division by zero condition!";

   }

   return (a/b);

}

捕获异常

catch 块跟在 try 块后面,用于捕获异常。您可以指定想要捕捉的异常类型,这是由 catch 关键字后的括号内的异常声明决定的。

try

{

   // 保护代码

}catch( ExceptionName e )

{

  // 处理 ExceptionName 异常的代码

}

上面的代码会捕获一个类型为 ExceptionName 的异常。如果您想让 catch 块能够处理 try 块抛出的任何类型的异常,则必须在异常声明的括号内使用省略号 ...,如下所示:

try

{

   // 保护代码

}catch(...)

{

  // 能处理任何异常的代码

}


下面是一个实例,抛出一个除以零的异常,并在 catch 块中捕获该异常。

#include <iostream>

using namespace std;

 

double division(int a, int b)

{

   if( b == 0 )

   {

      throw "Division by zero condition!";

   }

   return (a/b);

}

 

int main ()

{

   int x = 50;

   int y = 0;

   double z = 0;

 

   try {

     z = division(x, y);

     cout << z << endl;

   }catch (const char* msg) {

     cerr << msg << endl;

   }

 

   return 0;

}



异常描述

std::exception:该异常是所有标准 C++ 异常的父类。

std::bad_alloc:该异常可以通过 new 抛出。

std::bad_cast:该异常可以通过 dynamic_cast 抛出。

std::bad_exception:这在处理 C++ 程序中无法预期的异常时非常有用。

std::bad_typeid:该异常可以通过 typeid 抛出。

std::logic_error:理论上可以通过读取代码来检测到的异常。

std::domain_error:当使用了一个无效的数学域时,会抛出该异常。

std::invalid_argument:当使用了无效的参数时,会抛出该异常。

std::length_error:当创建了太长的 std::string 时,会抛出该异常。

std::out_of_range:该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator[]()。

std::runtime_error:理论上不可以通过读取代码来检测到的异常。

std::overflow_error:当发生数学上溢时,会抛出该异常。

std::range_error:当尝试存储超出范围的值时,会抛出该异常。

std::underflow_error:当发生数学下溢时,会抛出该异常。



 

推荐了解热门学科

java培训Python人工智能Web前端培训PHP培训
区块链培训影视制作培训C++培训产品经理培训
UI设计培训新媒体培训产品经理培训Linux运维
大数据培训智能机器人软件开发




传智播客是一家致力于培养高素质软件开发人才的科技公司“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。

传智播客从未停止思考

传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”

中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。

何为中高级程序员课程?

传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。




黑马程序员热门视频教程

Python入门教程完整版(懂中文就能学会)零起点打开Java世界的大门
C++| 匠心之作 从0到1入门学编程PHP|零基础入门开发者编程核心技术
Web前端入门教程_Web前端html+css+JavaScript软件测试入门到精通


在线咨询 我要报名