C++:3种方式实现错误处理
阅读原文时间:2021年04月21日阅读:1

题目要求

编写一个函数计算n! * 2^n的值,结果存放在数组A[arraySize]的第n个数组元素中,0≤n≤arraySize。假设计算机中允许的整数的最大值为maxInt,则当n>arraySize或者对于某一个k(0≤k≤n),使得k! * 2^k > maxInt时,应按出错处理。可有以下三种不同的出错处理方式:

  1. cerr <<exit(1)语句来中止执行并报告错误。
  2. 用返回整数函数值 0 和 1 来实现算法,以区别是正常返回还是错误返回。
  3. 在函数的参数表设置一个引用型的整型变量来区别是正常返回还是某种错返回。

参考解答

1 使用cerr配合exit()实现

#include <iostream>
#include <cmath>

#define maxInt 999999 //假设计算机允许存储的最大整数为999999

using namespace std;

int main() {
    int arraySize = INT8_MAX; //设置一个极大值
    int a[arraySize];
    int sum, tmp;
    for (int i = 0; i < arraySize; i++) {
        sum = 0;
        tmp = 1;
        for (int j = i; j >= 1; j--)
            tmp = tmp * j;
        sum += tmp;
        sum = sum * pow(2, i);
        a[i] = sum;
        if (sum > maxInt) {
            cerr << "Error: Data out of maxInt! a[" << i << "] > maxInt" << endl;
            exit(1);
        } else {
            cout << "a[" << i << "] = " << a[i] << endl;
        }
    }
    return 0;
}

需要指出的是,cerr是不经过缓冲而直接输出的,一般用于迅速输出出错信息。所以在运行时你有可能会看到报错信息优先于后面的输出而输出。

2 使用返回函数值来判断

#include <cmath>

#define maxInt 999999 //假设计算机允许存储的最大整数为999999

using namespace std;

int sum = 0;

int calc(int i){
    int tmp;
    sum = 0;
    tmp = 1;
    for (int j = i; j >= 1; j--)
        tmp = tmp * j;
    sum += tmp;
    sum = sum * pow(2, i);
    if (sum > maxInt)
        return 0;
    else
        return 1;
}

int main() {
    int arraySize = INT8_MAX; //设置一个极大值
    int a[arraySize];

    for (int i = 0; i < arraySize; i++) {
        if (calc(i)){
            a[i] = sum;
            cout << "a[" << i << "] = " << a[i] << endl;
        }
        else{
            cout << "Error: Data out of maxInt! a[" << i << "] > maxInt" << endl;
            exit(1);
        }
    }
    return 0;
}

3 使用在函数的参数表建立的引用型的整型变量来判断

如果我们想让被调函数中对形参做的修改同样对主调函数中的实参有效,用值调用不行,那怎么办呢?答案就是用题目所说的引用调用
引用是一种特殊类型的变量,我们可以认为它是另一个变量的别名,利用引用名和原来的变量名访问变量的效果是一样的。引用的形式是:类型标识符 & 引用名。比如:

    int  i, j; 
    int &ri=i;    // 建立一个int型的引用ri,并将其初始化为变量i的一个别名
    j=10;
    ri=j;          // 相当于 i=j;

编写代码如下:

#include <iostream>
#include <cmath>

#define maxInt 999999 //假设计算机允许存储的最大整数为999999

using namespace std;
int i = 0;

void comp(int sum){
    if (sum > maxInt){
        cout << "Error: Data out of maxInt! a[" << i << "] > maxInt" << endl;
        exit(1);
    }
}

int main() {
    int arraySize = INT8_MAX; //设置一个极大值
    int a[arraySize];
    int tmp, sum = 0;

    for (i = 0; i < arraySize; i++) {
        sum = 0;
        tmp = 1;
        for (int j = i; j >= 1; j--)
            tmp = tmp * j;
        sum += tmp;
        sum = sum * pow(2, i);

        int &rsum=sum;
        comp(rsum);
        a[i] = sum;
        cout << "a[" << i << "] = " << a[i] << endl;
    }
    return 0;
}

输出结果(以方法2/3为例)

a[0] = 1
a[1] = 2
a[2] = 8
a[3] = 48
a[4] = 384
a[5] = 3840
a[6] = 46080
a[7] = 645120
Error: Data out of maxInt! a[8] > maxInt

Process finished with exit code 1