题目要求(11 分) 下述程序使用错误码进行错误处理。请修改该函数和主程序: 移除基于错误码的错误处理逻辑(必要时修改函数返回值类型); 改用 C++ 异常(Exceptions)实现错误处理; 设计合理数量的异常类用于区分不同错误场景,所有异常类需继承自同一个基类; 错误信息的输出需放在异常类的虚方法中实现; 需将 berechneWerte 函数参数中的 ungueltigerWert 移除,但无效值仍需在错误信息中输出。 错误码含义(原程序逻辑) 0:无错误发生; 1:传入了空数组(长度为 0),未执行任何计算; 2:数组中存储的值超出有效范围(<0 或> 2047),此时无效值会被存入引用参数 ungueltigerWert。
#include <iostream>
using namespace std;
int berechneWerte(int * werte, unsigned int const n, int &ungueltigerWert) {
int errCode = 0;
if (n == 0) return errCode = 1;
for (unsigned int i = 0; i < n; ++i) {
if (werte[i] < 0 || werte[i] > 2047) {
errCode = 2;
ungueltigerWert = werte[i];
}
werte[i] *= (werte[i] + 1);
}
return errCode;
}
int main() {
int const n = 4;
int werte[n] = { 2, 1, -2, 1 };
int ungueltigerWert = 0;
int errCode = berechneWerte(werte, n, ungueltigerWert);
if (errCode == 1) {
cerr << "Fehler: Arraygroesse 0" << endl;
} else if (errCode == 2) {
cerr << "Fehler: Array enthaelt ungueltigen Wert " << ungueltigerWert << endl;
} else {
for (unsigned int i = 0; i < n; ++i) {
cout << werte[i] << endl;
}
}
return 0;
}
二、完整实现代码(基于 exception 基类)
#include <iostream>
#include <exception> // C++ 异常基类头文件
#include <string> // 用于拼接错误信息
using namespace std;
// 步骤1:定义异常基类(继承自 std::exception)
class BerechneFehler : public exception {
public:
// 纯虚方法:输出错误信息(由子类实现)
virtual void ausgabeFehler() const noexcept = 0;
// 重写基类 what() 方法(可选,保持兼容性)
const char* what() const noexcept override {
return "BerechneFehler: 计算过程中发生错误";
}
// 虚析构函数(基类必须声明)
virtual ~BerechneFehler() noexcept = default;
};
// 步骤2:定义子类1 - 空数组异常
class LeeresArrayFehler : public BerechneFehler {
public:
// 实现基类的虚方法:输出空数组错误信息
void ausgabeFehler() const noexcept override {
cerr << "Fehler: Arraygroesse 0" << endl;
}
// 重写 what() 增强描述(可选)
const char* what() const noexcept override {
return "LeeresArrayFehler: 数组长度为0,无法计算";
}
};
// 步骤3:定义子类2 - 无效值异常(存储无效值用于输出)
class UngueltigerWertFehler : public BerechneFehler {
private:
int ungueltigerWert; // 存储超出范围的无效值
public:
// 构造函数:接收无效值
explicit UngueltigerWertFehler(int wert) noexcept : ungueltigerWert(wert) {}
// 实现基类的虚方法:输出含无效值的错误信息
void ausgabeFehler() const noexcept override {
cerr << "Fehler: Array enthaelt ungueltigen Wert " << ungueltigerWert << endl;
}
// 重写 what() 增强描述(可选)
const char* what() const noexcept override {
static string msg; // static 避免临时对象析构
msg = "UngueltigerWertFehler: 无效值 " + to_string(ungueltigerWert) + " (范围需 0-2047)";
return msg.c_str();
}
};
// 步骤4:修改 berechneWerte 函数(移除错误码和 ungueltigerWert 参数)
void berechneWerte(int* werte, unsigned int const n) {
// 检查空数组:抛空数组异常
if (n == 0) {
throw LeeresArrayFehler();
}
// 遍历数组计算 + 检查无效值
for (unsigned int i = 0; i < n; ++i) {
int wert = werte[i];
// 检查值范围:抛无效值异常(传入当前无效值)
if (wert < 0 || wert > 2047) {
throw UngueltigerWertFehler(wert);
}
// 正常计算逻辑
werte[i] *= (wert + 1);
}
}
// 步骤5:修改主程序(用 try-catch 处理异常)
int main() {
int const n = 4;
int werte[n] = { 2, 1, -2, 1 }; // 包含无效值 -2
try {
// 调用修改后的函数(无错误码/引用参数)
berechneWerte(werte, n);
// 无异常时输出计算结果
for (unsigned int i = 0; i < n; ++i) {
cout << werte[i] << endl;
}
}
// 捕获所有自定义异常(基类引用,多态生效)
catch (const BerechneFehler& fehler) {
// 调用子类的虚方法输出错误信息
fehler.ausgabeFehler();
}
// 捕获标准异常(兜底)
catch (const exception& e) {
cerr << "Unbekannter Fehler: " << e.what() << endl;
}
// 捕获所有未匹配的异常
catch (...) {
cerr << "Schwerwiegender unbekannter Fehler!" << endl;
}
return 0;
}
三、核心实现说明
1. 异常类设计(满足题目要求)
基类 BerechneFehler:
继承自 std::exception(C++ 标准异常基类);
声明纯虚方法 ausgabeFehler()(强制子类实现错误信息输出);
重写 what() 方法(保持与标准异常的兼容性);
声明虚析构函数(避免子类析构时内存泄漏)。
子类 LeeresArrayFehler:处理空数组错误,实现 ausgabeFehler() 输出「数组长度为 0」。
子类 UngueltigerWertFehler:
私有成员存储无效值(替代原引用参数 ungueltigerWert);
构造函数接收无效值,ausgabeFehler() 输出含具体无效值的错误信息。
2. 函数修改要点
移除返回值(原错误码),改为 void(异常通过 throw 抛出,无需返回码);
移除 ungueltigerWert 引用参数,无效值通过异常类的构造函数传入并存储;
空数组时抛出 LeeresArrayFehler,值越界时抛出 UngueltigerWertFehler。
3. 主程序修改要点
用 try-catch 包裹函数调用,替代原错误码判断逻辑;
通过基类引用捕获所有自定义异常(多态特性:调用子类的 ausgabeFehler());
无异常时正常输出计算结果,异常时调用虚方法输出错误信息。
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com