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

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

同时,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-风格字符串;

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. 轻量级的同步机制——volatile语义详解(可见性保证+禁止指令重排)

    目录 1.关于volatile 2.语义一:内存可见性 2.1 一个例子 2.2 java的内存模型(JMM) 2.3 happens-before规则 2.4 volatile解决内存可见性问题的原 ...

  2. elasticsearch2.x插件之一:kopf

    kopf kopf is a simple web administration tool for elasticsearch written in JavaScript + AngularJS + ...

  3. 217. Contains Duplicate数组重复元素 123

    [抄题]: Given an array of integers, find if the array contains any duplicates. Your function should re ...

  4. solr开发 小案例

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" ...

  5. [GO]随机生成切片元素并使用冒泡排序方式进行排序

    package main import ( "math/rand" "time" "fmt" ) func ButtleData(s []i ...

  6. TP5多入口设置

    今天在用tp5做项目的时候发现,前台是可以绑定默认到index模块的,但是后台不好弄,于是查了一下手册,按照手册上说的,复制了index.php改为admin.php,作为后台的入口文件,于是域名/a ...

  7. C#中ref和out的作用和区别

    相同点:方法的定义和调用都必须显示使用ref.out关键字.都会导致参数按引用传递. 不同点:传递给ref关键字的参数必须赋初始值,而out不用.out关键字会清空变量,即使变量已经赋值也不行,退出函 ...

  8. 使用Fiddler进行IOS APP的HTTP抓包

    Fiddler不但能截获各种浏览器发出的HTTP请求, 也可以截获各种智能手机发出的HTTP/HTTPS请求.Fiddler能捕获IOS设备发出的请求,比如IPhone, IPad, MacBook. ...

  9. 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

    从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负责的模块connector就派上了用场. ...

  10. ajaxfileupload 跨域 (二级域名) 可行办法

    ajaxfileupload 跨二级域名 如 aa.fei.com 到 bb.fei.com 是可行的. 1.首先在html页面 ajaxfileupload上方加入 document.domain= ...