曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3362|回复: 0
打印 上一主题 下一主题

将对象用作异常类型

[复制链接]

716

主题

734

帖子

2946

积分

超级版主

Rank: 9Rank: 9Rank: 9

积分
2946
跳转到指定楼层
楼主
发表于 2013-12-29 14:39:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
引发异常的函数不但可以传递整型,字符串等常用类型,还可以传递一个对象。传递对象的优点是:可以使用不同的异常类型来区分不同的函数在不同的情况下引发的异常。此外,对象可以携带信息,并可以根据这些信息来确定引发异常的原因;同时,catch 可以根据这些信息来决定采取什么样的措施。

考虑下面的代码:

exec_mean.h
[C++] 纯文本查看 复制代码
// exec_mean.h  -- exception classes for hmean(), gmean()
#include <iostream>

class bad_hmean
{
private:
    double v1;
    double v2;
public:
    bad_hmean(double a = 0, double b = 0) : v1(a), v2(b){}
    void mesg();
};

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

class bad_gmean
{
public:
    double v1;
    double v2;
    bad_gmean(double a = 0, double b = 0) : v1(a), v2(b){}
    const char * mesg();
};

inline const char * bad_gmean::mesg()
{
    return "gmean() arguments should be >= 0\n";
}


error4.cpp
[C++] 纯文本查看 复制代码
//error4.cpp – using exception classes
#include <iostream>
#include <cmath> // or math.h, unix users may need -lm flag
#include "exec_mean.h"
// function prototypes
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 {                  // start of try block
                        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>: ";
                }// end of try block
                catch (bad_hmean & bg)    // start of catch block
                {
                        bg.mesg();
                        cout << "Try again.\n";
                        continue;
                }
                catch (bad_gmean & hg)
                {
                        cout << hg.mesg();
                        cout << "Values used: " << hg.v1 << ", "
                                << hg.v2 << endl;
                        cout << "Sorry, you don't get to play any more.\n";
                        break;
                } // end of catch block
        }
        cout << "Bye!\n";
        // cin.get();
        // cin.get();
        return 0;
}

double hmean(double a, double b)
{
        if (a == -b)
                throw bad_hmean(a, b);
        return 2.0 * a * b / (a + b);
}

double gmean(double a, double b)
{
        if (a < 0 || b < 0)
                throw bad_gmean(a, b);
        return std::sqrt(a * b);
}

在上面的主程序中,有两个计算式,一个是计算两个数的调和平均数(两个数字倒数的平均值的倒数, hmean() 函数);另一个是计算几何平均值,即乘积的平方根(gmean() 函数)。

从 hmean() 中可以看到,当传递进来的两数如果互为负数,那么将引发被 0 除的异常,此时通过 throw 抛出一个 bad_hmean 对象,同时用传递进来的两个参数 a 和 b 对其初始化。
从 gmean() 中可以看到,当传递进来的两数若有一个为负数,那么将引发异常,此时抛出一个 bad_gmean() 异常,同时用传递进来的两个参数 a 和 b 对其初始化。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-30 09:49 , Processed in 0.061049 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表