通常,引发异常的函数将传递一个对象。这样做的重要优点之一就是,可以利用不同的异常类型来区分不同的函数在不同的情况下引发的异常

对象可以携带信息,程序员可以根据这些信息来确定异常的原因。

同时,catch块可以根据这些信息来决定采取什么样的措施。

下面是针对函数引发的异常而提供的一种设计:

  1. class bad_hmean
  2. {
  3. private:
  4. double v1;
  5. double v2;
  6.  
  7. public:
  8. bad_hmean(int a =, int b=):v1(a), v2(b) {}
  9. void mesg();
  10. };
  11.  
  12. inline void bad_hmean::mesg()
  13. {
  14. std::cout<<"hmean("<<v1<<","<<v2<<"):"
  15. <<"invalid arguments: a = -b\n";
  16.  
  17. }

可以将bad_hmean对象初始化为传递给含税hmean()的值,而方法mesg()可用于报告问题。

函数hmean()可以使用如下代码:

  1. if (a == -b)
  2. throw bad_hmean(a,b);

上述代码调用构造函数bad_hmean(),以初始化对象,使其存储参数值。

接下来看一个新的例子:

添加了一个新的异常类bad_gmean,类bad_gmean中的函数gmean()计算两个数的几何平均值,即乘积的平方根。

  1. //exc_exam.h -- exception classes for hmean(), gmean()
  2. #include <iostream>
  3.  
  4. class bad_hmean()
  5. {
  6. private:
  7. double v1;
  8. double v2;
  9.  
  10. public:
  11. bad_hmean(double a=, double b=) : v1(a), v2(b){}
  12. void mesg();
  13. };
  14.  
  15. inline void bad_hmean::mesg()
  16. {
  17. std::cout<<"hmean("<<v1<<","<<v2<<"):"
  18. <<"invalid arguments:a=-b\n";
  19. }
  20.  
  21. class bad_gmean()
  22. {
  23. double v1;
  24. double v2;
  25. bad_gmean(double a=, double b=):v1(a), v2(b){}
  26. const char * mesg();
  27. };
  28.  
  29. inline const char * bad_gmean::mesg()
  30. {
  31. return "gmean() arguments should be >=0\n";
  32. }
  1. //error4.cpp - using exception classes
  2. #include <iostream>
  3. #include <cmath>
  4. #include "exc_mean.h"
  5.  
  6. double hmean(double a, double b);
  7. double gmean(double a, double b);
  8.  
  9. int main()
  10. {
  11. using std::cout;
  12. using std::cin;
  13. using std::endl;
  14.  
  15. double x,y,z;
  16.  
  17. cout<<"Enter two numbers: ";
  18. while(cin>>x>>y)
  19. {
  20. try {
  21. z = hmean(x,y);
  22. cout<<"Harmonic mean of"<<x<<" and "<<y
  23. <<" is "<<z<<endl;
  24. cout<<"Geometric mean of "<<x<<" and "<<y
  25. <<" is "<<gmean(x,y)<<endl;
  26. cout<<"Enter next set of numbers <q to quit>:";
  27. }
  28. }
  29. catch(bad_hmean & bg)
  30. {
  31. bg.mesg();
  32. cout<<"Try again.\n";
  33. continue;
  34. }
  35. catch(bad_gmean & hg)
  36. {
  37. bg.mesg();
  38. cout<<"Value used: "<<hg.v1<<", "
  39. <<hg.v2<<end;
  40. cout<<"Sorry, you don't get to play any more.\n";
  41. break;
  42. }
  43.  
  44. cout<<"Bye!\n";
  45. return ;
  46. }
  47.  
  48. double hmean();
  49. {
  50. if(a ==-b)
  51. throw bad_hmean(a,b);
  52. return 2.0*a*b/(a+b);
  53. }
  54.  
  55. double gmean();
  56. {
  57. if(a<||b<)
  58. throw bad_gmean(a,b);
  59. return std::sqrt(a*b);
  60. }

bad_hmean()和bad_gmean()使用的技术不一样,

bad_gmean()使用的是公有方法和公有数据,该方法返回一个C-风格字符串;

C++_异常4-将对象用作异常类型的更多相关文章

  1. C++异常 将对象用作异常类型

    通常,引发异常的函数将传递一个对象.这样做的重要有点之一是,可以使用不同的异常类型来区分不同的函数在不同情况下引发的异常.另外,对象可以携带信息,程序员可以根据这些信息来确定引发异常的原因.同时,ca ...

  2. Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换

    Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换 { "@type":"java.lang.Runti ...

  3. JavaScript Date 对象的异常现象-new Date('0001-01-01 00:00:00')

    Date 对象 Date 对象用于处理日期和时间. new Date() :Date 对象会自动把当前日期和时间保存为其初始值. 打开chrome的开发者工具,在Console敲下new Date() ...

  4. js调用activeX插件 报异常:TypeError:对象不支持 属性方法

    部署之后的js网页如果调用没有签名的 ocx/dll 插件的话会报异常:TypeError:对象不支持 “init” 属性方法 (init为插件公开的方法) 但是如果写一个htm本地文件去调用插件,和 ...

  5. 【C/C++学院】0831-类与对象的异常/面试100题1-100

    类与对象的异常 Cpp异常 #include <iostream> #include <string.h> using namespace std; //标识错误的类型 cla ...

  6. Python基础之函数:5、内置函数、迭代器对象、异常的捕获和处理

    目录 一.重要内置函数 1.zip() 2.filter() 3.sorted() 二.常见内置函数 1. abs() 2.all.any() 3.bin.oct.hex.int() 4.bytes( ...

  7. 01 语言基础+高级:1-7 异常与多线程_day05 【异常、线程】

    day05 [异常.线程] 主要内容 异常.线程 教学目标 能够辨别程序中异常和错误的区别 说出异常的分类 说出虚拟机处理异常的方式 列举出常见的三个运行期异常 能够使用try...catch关键字处 ...

  8. Effective Java 第三版——69. 仅在发生异常的条件下使用异常

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  9. 【转】Java异常总结和Spring事务处理异常机制浅析

    异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误.本文主要讲授的是Java语言的异常处理.Java语言的异常处理框架,是Java语言健壮性的一个重要体现. Thorwable类所有异常 ...

随机推荐

  1. 刷题向》关于第一篇状压DP BZOJ1087 (EASY+)

    这是本蒟蒻做的第一篇状压DP,有纪念意义. 这道题题目对状压DP十分友善,算是一道模板题. 分析题目,我们发现可以用0和1代表每一个格子的国王情况, 题目所说国王不能相邻放置,那么首先对于每一行是否合 ...

  2. selenium2 定位 窗体切换等等 (二)

    定位用的html素材有两个 demo.html <html> <head> <title>UI Automation Testing</title> & ...

  3. 9. Palindrome Number 回文数的判断

    [抄题]: Determine whether an integer is a palindrome. An integer is a palindrome when it reads the sam ...

  4. 性能优化之_android多线程

    本文大纲为: 如何创建线程 线程间如何通讯 线程间如何安全的共享信息 一.线程的创建 Thread在run方法中执行具体事务,或者传入一个runnable对象,但是不能调用view控件的更新方法,但是 ...

  5. k阶原点距和k阶中心距各是说明什么数字特征

    k阶原点距和k阶中心距各是说明什么数字特征 二阶中心距,也叫作方差,它告诉我们一个随机变量在它均值附近波动的大小,方差越大,波动性越大.方差也相当于机械运动中以重心为转轴的转动惯量.(The mome ...

  6. 31.SUM() 函数

    SUM() 函数 SUM 函数返回数值列的总数(总额). SQL SUM() 语法 SELECT SUM(column_name) FROM table_name SQL SUM() 实例 我们拥有下 ...

  7. Flask 之 上下文管理

    Flask上下文管理 分类: 请求上下文管理 应用上下文管理 请求上下文管理 request a. 温大爷:wsig b. 赵毅: ctx = ReuqestContext(session,reque ...

  8. rpm遇到的坑-与VMP冲突

    rpm遇到的坑-与VMP冲突 摘自:https://blog.csdn.net/shijichao2/article/details/78797586 2017年12月13日 22:29:21 阅读数 ...

  9. python,itertools模块

    itertools模块的使用: # coding=utf-8 """ itertools模块 """ import itertools im ...

  10. rest 参数和扩展运算符

    rest 参数和扩展运算符 rest 参数的形式为 ...变量名:扩展运算符是三个点 .... rest 参数 function add(...values) { console.log(values ...