错误处理和调试2

让函数返回错误代码:

  让程序能够自行处理潜在错误的办法之一是创建一些测试函数:专门测试某种条件并根据测试结果返回一个代码来表示当前函数的执行状态。

int myFunction() {
    if( condition ) {
        return 0;
    } 
    else {
        return 1;
    }
}

   这种方式我们已经了然于心,但我们仍有进一步继续讨论的必要。 不知道大家还记不记得很久很久以前,我们一起写过的那个求阶乘的栗子:factorial.cpp

#include <iostream>

unsigned long returnFactorial(unsigned short num);

int main()
{
    unsigned short num;

    std::cout << "请输入一个整数: ";
    std::cin >> num;
    std::cout << num << "的阶乘结果是: " << returnFactorial(num) << "
";

    return 0;
}

unsigned long returnFactorial(unsigned short num)
{
    unsigned long sum = 1;

    for( int i=1; i <= num; i++ )
    {
        sum *= i;
    }

    return sum;
}

  其实这个栗子充满隐患,为什么? 我们输入13,从表面上看,程序既没有崩溃也没有报告出错,但它已经不正常了!

请输入一个整数: 13
13的阶乘结果是: 1932053504
请按任意键继续. . .

  我们来看下13阶乘的正确结果是:6227020800。

  在知道问题后,我们其实也很容易的就可以猜到错误发生的原因:计算阶乘的值超出了计算机所能表达的最大整数(至少在我们这台机子上)。 鉴于这类问题的纠正,在这里教大家一个新技巧:运用 climits 头文件。

  climits 头文件?这个头文件从 C 的 limits.h 头文件引用过来的。主要列出了各种数据类型在给定操作系统上的取值范围,并且把每种数据类型的最大可取值和最小可取值都分别定义为一个常量供我们比较。

  比如,SHORT_MAX 代表短整数类型在给定系统上的最大可取值,SHORT_MIN 代表短整数类型在给定操作系统上的最小可取值。USHORT_MAX 代表无符号整数类型的最大可取值。 在这个程序里,为了判断阶乘计算的结果没有超出一个无符号长整数的最大取值,我们可以使用 ULONG_MAX 来提前获得这个值进行对比。

  一起动手来修改这个代码:factorial2.cpp

#include <iostream>
#include <climits>

class Factorial
{
public:
    Factorial(unsigned short num);
    unsigned long getFactorial();
    bool inRange();

private:
    unsigned short num;
};

Factorial::Factorial(unsigned short num)
{
    this->num = num;
}

unsigned long Factorial::getFactorial()
{
    unsigned long sum = 1;

    for( int i=1; i <= num; i++ )
    {
        sum *= i;
    }

    return sum;
}

bool Factorial::inRange()
{
    unsigned long max = ULONG_MAX;

    for( int i=num; i >= 1; --i )
    {
        max /= i;
    }

    if( max < 1 )
        return false;
    else
        return true;
}

int main()
{
    unsigned short num = 0;

    std::cout << "请输入一个整数: ";
    std::cin >> num;

    Factorial fac(num);

    if( fac.inRange() )
    {
        std::cout << num << "的阶乘值是" << fac.getFactorial() << "

";
    }
    else
    {
        std::cout << "您所输入的值太大!

";
    }

    return 0;
}

  有些程序员喜欢使用异常(咱们将在稍后学习),而不是使用 return 语句。反对使用 return 语句的主要理由是:把各种出错代码进行处理的语句混杂在程序的主干部分既不利于模块化编程,又容易干扰正常的思考!

原文地址:https://www.cnblogs.com/tianqizhi/p/10449248.html