zoukankan      html  css  js  c++  java
  • C++异常 将对象用作异常类型

    通常,引发异常的函数将传递一个对象。这样做的重要有点之一是,可以使用不同的异常类型来区分不同的函数在不同情况下引发的异常。另外,对象可以携带信息,程序员可以根据这些信息来确定引发异常的原因。同时,catch块可以根据这些信息来决定采取什么样的措施。
    下面的两个程序用语言是这个效果。如果函数hmean()引发bad_mean异常,第一个catch块将捕获该异常;如果gmean()引发bad_gmaen异常,异常将逃过第一个catch块,被第二个catch块捕获。
    exc_mean.h

    // exc_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
    ";
    }
    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
    ";
    }

    error4.cpp

    // error4.cpp -- using exception classes
    #include <iostream>
    #include <cmath>    // or math.h, unix users may need -lm flag
    #include "exc_mean.h"
    // function prototypes
    double hmean(double a, double b);
    double gmean(double a, double b);
    
    int main()
    {
        using std::cin;
        using std::cout;
        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.
    ";
                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.
    ";
                break;
            } // end of catch block
        }
        cout << "Bye!
    ";
        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);
    }

    效果:

    Enter two numbers: 4 12
    Harmonic mean of 4 and 12 is 6
    Geometric mean of 4 and 12 is 6.9282
    Enter next set of numbers <q to quit>: 5 -5
    hmean(5, -5): invalid arguments: a = -b
    Try again.
    5 -2
    Harmonic mean of 5 and -2 is -6.66667
    gmean() arguments should be >= 0
    Values used: 5, -2
    Sorry, you don't get to play any more.
    Bye!
  • 相关阅读:
    Java高级部分--工具类(1)
    Javascript 与正则表达式
    Java基础部分--面向对象基础(1)
    Java基础部分--面向对象高级特性(2)
    持久层框架--hibernate(4)
    持久层框架--hibernate(3)
    持久层框架--hibernate(2)
    python常见面试题
    单元测试之写用例(全局变量,异常处理,断言)
    jmeter安装踩坑记录
  • 原文地址:https://www.cnblogs.com/moonlightpoet/p/5670535.html
Copyright © 2011-2022 走看看