在C++中,异常处理包括:

· throw表达式(throw expression) 异常检测部分使用throw表达式来表示它遇到了无法处理的问题。throw表达式抛出一个异常并把控制权转移到能处理该异常的最近的catch子句。

· try语句块(try block) 异常处理部分使用try语句块处理异常。try关键字后跟着一个块和多个catch子句。如果try语句块的代码throw了异常并且其中一个catch子句匹配该异常类型,则异常被该catch子句处理,否则,异常将由外围try(try语句块可以调用包含另一个try语句块的函数)  处理,或者调用标准库的terminate函数终止当前程序。

· 一套异常类(exception class) 用于在throw表达式和相关的catch子句之间传递异常的具体信息。

  1. if(a != b)
  2. throw runtime_error("Data must refer to same value");

上面的代码就是如果a和b不相等时,就抛出一个异常,该异常是类型runtime_error的对象。抛出异常将终止当前的函数,并把控制权转移给能处理该异常的代码。

  1. int a, b;
  2. while(cin >> a >> b){
  3. try{
  4. if(a != b)
  5. throw runtime_error("Data must refer to same value");
  6. }catch(runtime_error err){
  7. cout << err.what() << "\nTry Again? Enter y or n" << endl;
  8. char c;
  9. cin >> c;
  10. if(!cin || c == 'n') break;
  11. }
  12. }

上面的代码中,try语句块中如果判断a与b不相等,就抛出一个runtime_error类型的异常,try语句块后有一个与之相对应的catch语句,那么就会执行该catch语句来处理异常。

what函数返回值是一个指向C风格字符串的const char*。what函数返回的C风格字符串的内容与异常对象的类型有关。如果异常类型有一个字符串初始值,则what返回该字符串。对于其他吴初始值的异常类型来说,what返回的内容由编译器决定。

关于标准异常

C++标准库定义了一组类,用于报告标准库函数遇到的问题。这些异常类也可以在用户编写的程序中使用,它们分别定义在4个头文件中:

· exception头文件定义了最通用的异常类exception。它只报告异常的发生,不提供任何额外信息。

· stdexcept头文件定义了几种常用的异常类。

· new头文件定义了bad_alloc异常类型。

· type_info头文件定义了bad_cast异常类型。

以上图片摘自qingdujun的博客:https://blog.csdn.net/qingdujun/article/details/75195061

try语句块和异常处理的更多相关文章

  1. 【c++ primer, 5e】【try语句块】

    p172~p177:c++的try语句块和异常处理: 1.通常,与用户交互的代码和对象相加(底层的代码)是分离开的,异常由与用户交互的代码处理(底层代码抛出异常就可以了). 2.C++的runtime ...

  2. java中 在一个异常处理中什么语句块是可多个的

    MM们 异常处理一般格式:捕获异常:try{//代码块}catch(异常类型,例如:Exception e){//需要抛出的异常,例如:e.printStackTrace();}catch(异常类型) ...

  3. Python中else语句块(和if、while、for、try搭配使用)

    学过C/C++的都知道,else语句是和if语句搭配使用的, 但是在Python中,else语句更像是作为一个模块,不仅仅可以和if语句搭配,还可以和循环语句,异常处理语句搭配使用.下面逐个进行介绍: ...

  4. 左右 Java 于 finally 深度分析语句块

    首先,让我们来问你一个问题:finally 声明块将运行? 很多人认为 finally 语句块是一定要运行.其中还包括了一些非常有经验的 Java 程序猿.不幸的是,没有像很多像人们想象,对于这个问题 ...

  5. try...catch...finally语句块

    try-catch-finally语句主要是用来处理检查异常,捕获并处理,以及最后必须要执行的finally块. try-catch-finally语句入门: 1.try-catch-finally语 ...

  6. 线程系列07,使用lock语句块或Interlocked类型方法保证自增变量的数据同步

    假设多个线程共享一个静态变量,如果让每个线程都执行相同的方法每次让静态变量自增1,这样的做法线程安全吗?能保证自增变量数据同步吗?本篇体验使用lock语句块和Interlocked类型方法保证自增变量 ...

  7. .NET基础 一步步 一幕幕[循环、逻辑语句块]

    循环.逻辑语句块   好久不写博客了,断更了好几天了,从上周五到今天,从北京到上海,跨越了1213.0公里,从一个熟悉的城市到陌生的城市,还好本人适应力比较好,还有感谢小伙伴的接风咯,一切都不是事,好 ...

  8. static{ }语句块详解

    static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法.举ge例子: public class Test { public static i ...

  9. begin-end语句块在mysql中的使用问题

    在最近在通过navicate连接mysql数据库时,进行查询操作: delimiter $$BEGIN SET @a=1; if (@a > 0) THEN SELECT COUNT(*) fr ...

随机推荐

  1. Spring在代码中获取bean的几种方式(转)

    获取spring中bean的方式总结: 方法一:在初始化时保存ApplicationContext对象 ApplicationContext ac = new FileSystemXmlApplica ...

  2. png 深度图像 转为 点云(opencv2)

    https://github.com/kruglov-dmitry/pnd2pcd_batch

  3. spring.net事件的注入

    .c#代码 TestObject source = new TestObject(); TestEventHandler eventListener1 = new TestEventHandler() ...

  4. poj 3304 Segments (题意理解出错,错误的只枚举了过线段的直线)

    //枚举过每一条线段的直线, //再判断其他线段的点在直线上或被直线穿过 //即求直线与线段相交(叉积) #include<stdio.h> #include<math.h> ...

  5. Go语言内存分配机制

    前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...

  6. 编写高质量代码改善C#程序的157个建议——建议109:谨慎使用嵌套类

    建议109:谨慎使用嵌套类 使用嵌套类的原则是:当某类型需要访问另一个类型的私有成员时,才将它实现为嵌套类.一个典型的例子是在实现集合时,要为集合实现迭代器,这时用到了嵌套类.代码如下所示: publ ...

  7. 编写高质量代码改善C#程序的157个建议——建议74:警惕线程的IsBackground

    建议74:警惕线程的IsBackground 在CLR中,线程分为前台线程和后台线程,即每个线程都有一个IsBackground属性.两者在表现形式上的唯一区别是:如果前台线程不退出,应用程序的进程就 ...

  8. 深入理解java虚拟机(十二) Java 语法糖背后的真相

    语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是,在计算机语言中添加某种语法,这些语法糖虽然不会对语言 ...

  9. GCT感受

    GCT考试已经结束了,但是复习GCT的时候一直没来得及总结点什么,GCT考的比较基础,所以复习起来并不是特别费力,但是还是有一些东西值得我们去学习的. 对于GCT考试,一开始在报名的时候其实心里是挺抵 ...

  10. MongoDB整理笔记のjava MongoDB分页优化

    最近项目在做网站用户数据新访客统计,数据存储在MongoDB中,统计的数据其实也并不是很大,1000W上下,但是公司只配给我4G内存的电脑,让我程序跑起来气喘吁吁...很是疲惫不堪. 最常见的问题莫过 ...