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

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

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

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

 class bad_hmean
{
private:
double v1;
double v2; public:
bad_hmean(int a =, int b=):v1(a), v2(b) {}
void mesg();
}; inline void bad_hmean::mesg()
{
std::cout<<"hmean("<<v1<<","<<v2<<"):"
<<"invalid arguments: a = -b\n"; }

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

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

 if (a == -b)
throw bad_hmean(a,b);

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

接下来看一个新的例子:

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

 //exc_exam.h  --  exception classes for hmean(), gmean()
#include <iostream> class bad_hmean()
{
private:
double v1;
double v2; public:
bad_hmean(double a=, double b=) : v1(a), v2(b){}
void mesg();
}; inline void bad_hmean::mesg()
{
std::cout<<"hmean("<<v1<<","<<v2<<"):"
<<"invalid arguments:a=-b\n";
} class bad_gmean()
{
double v1;
double v2;
bad_gmean(double a=, double b=):v1(a), v2(b){}
const char * mesg();
}; inline const char * bad_gmean::mesg()
{
return "gmean() arguments should be >=0\n";
}
 //error4.cpp - using exception classes
#include <iostream>
#include <cmath>
#include "exc_mean.h" double hmean(double a, double b);
double gmean(double a, double b); int main()
{
using std::cout;
using std::cin;
using std::endl; double x,y,z; cout<<"Enter two numbers: ";
while(cin>>x>>y)
{
try {
z = hmean(x,y);
cout<<"Harmonic mean of"<<x<<" and "<<y
<<" is "<<z<<endl;
cout<<"Geometric mean of "<<x<<" and "<<y
<<" is "<<gmean(x,y)<<endl;
cout<<"Enter next set of numbers <q to quit>:";
}
}
catch(bad_hmean & bg)
{
bg.mesg();
cout<<"Try again.\n";
continue;
}
catch(bad_gmean & hg)
{
bg.mesg();
cout<<"Value used: "<<hg.v1<<", "
<<hg.v2<<end;
cout<<"Sorry, you don't get to play any more.\n";
break;
} cout<<"Bye!\n";
return ;
} double hmean();
{
if(a ==-b)
throw bad_hmean(a,b);
return 2.0*a*b/(a+b);
} double gmean();
{
if(a<||b<)
throw bad_gmean(a,b);
return std::sqrt(a*b);
}

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

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

最新文章

  1. embed标签
  2. Twain头文件
  3. [Liferay6.2]启动Tomcat提示APR不能在java类库路径中被找到的解决办法
  4. spring-mvc.xml报错cvc-complex-type.2.4.c
  5. IOS图像拉伸解决方案
  6. mysql 数据库自增id 的总结
  7. A题进行时--浙大PAT 1021-1030
  8. JavaMail 发送邮件
  9. ASP.NET入门 - 错误和异常处理
  10. CeontOS7安装ansible
  11. 14.3.4 Phantom Rows 幻影行
  12. MVC 5 Web编程2 -- URL映射
  13. Note_JavaWeb_SpringMVC_尚硅谷
  14. csv文件读取
  15. API管理平台XXL-API
  16. generator mybatis逆向工程
  17. mybatis环境配置与入门例子
  18. java连接数据库读取数据出现乱码
  19. Spark2.1.0安装
  20. Java知多少(99)Graphics2D类的绘图方法

热门文章

  1. uva1619
  2. linux上mysql安装
  3. 单机配置tomcat 8 集群
  4. 算法Sedgewick第四版-第3章Searching-搜索总结
  5. Edge 自动给数字加下划线的问题
  6. Media Queries 媒体类型
  7. c#并发编程经典实例文摘
  8. Position Independent Code (PIC) in shared libraries
  9. 那些年我们追过的SQL
  10. fabric Clone