火龙信奥
  • 首页
  • 课程
  • 题库
  • 打卡
    • 代码对战
    • 快速对战
  • 题单
  • 团队
  • 荣誉墙
  • 商城
  • 登录 / 注册

把代码改成异常处理代码

作者: 作者的头像   huolong , 时间:2026-03-17 21:56:11 , 所有人可见, 阅读  9

题目要求(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

©2026加盟我们 | 关于我们 | ACM课程 | 常见问题 | 成果墙 | 评测记录 | 浙ICP备2021013995号
在线画图 | OI WIki | 打字练习
火龙信奥
请输入登录信息


请完成安全验证
验证码底图 滑块
向右拖动滑块完成验证
请输入用户名 / 绑定的手机号码



请输入注册信息(手机号验证码注册)





验证码5分钟有效,60秒内不可重复获取,每日最多3次

微信登录

微信登录二维码

正在生成二维码...

账号已过期,请续期。
去续期

绑定手机号

📱

为了更好地保护您的账号安全,享受完整的平台服务

请您尽快绑定手机号码