You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C++捕获异常后如何重新调用函数以获取有效输入?

解决捕获异常后重新调用函数的问题

嘿,我懂你的困扰!你现在想实现的是:当调用getInteger()抛出异常时,自动重新尝试获取有效输入,而且还不能修改getInteger()本身,对吧?你的初步思路用了while循环,但还没完全实现无缝重试的效果,我来给你调整一下代码,帮你搞定这个需求。

方案一:用标志位控制内部重试循环

这个方案用一个布尔标志来标记输入是否成功,内部循环会一直重试直到拿到有效输入:

#include <iostream>
#include <vector>
#include <stdexcept>

// 假设这是你不能修改的getInteger()函数
int getInteger() {
    int num;
    std::cin >> num;
    if (std::cin.fail()) {
        std::cin.clear();
        std::cin.ignore(1000, '\n');
        throw std::invalid_argument("输入不是有效的整数");
    }
    return num;
}

int main() {
    bool keepRunning = true;
    while (keepRunning) {
        bool inputValid = false;
        int validNum;

        // 内部循环:一直重试直到输入有效
        while (!inputValid) {
            try {
                validNum = getInteger();
                inputValid = true; // 输入成功,标记为有效
            } catch (const std::exception &e) {
                std::cout << "哎呀出问题了!😅" << std::endl;
                std::cout << "问题原因:" << e.what() << std::endl;
                std::cout << "请重新输入一个整数:" << std::endl;
            }
        }

        // 输入有效后的逻辑
        std::vector<int> numVec;
        numVec.push_back(validNum);
        std::cout << "成功获取有效数字:" << validNum << std::endl;

        // 询问是否继续输入
        char choice;
        std::cout << "还要继续输入数字吗?(y/n): ";
        std::cin >> choice;
        keepRunning = (choice == 'y' || choice == 'Y');
    }
    return 0;
}

方案说明:

  • 新增了inputValid标志,用来判断是否成功获取到有效输入
  • 内部的while (!inputValid)会反复执行try块,直到getInteger()没有抛出异常,此时设置inputValid = true,退出重试循环
  • 外层的keepRunning循环用来控制是否继续接收新的输入,符合你原来的state逻辑

方案二:用do-while简化重试逻辑

如果觉得标志位有点繁琐,也可以用do-while循环来实现,代码更简洁:

#include <iostream>
#include <vector>
#include <stdexcept>

int getInteger() {
    int num;
    std::cin >> num;
    if (std::cin.fail()) {
        std::cin.clear();
        std::cin.ignore(1000, '\n');
        throw std::invalid_argument("输入不是有效的整数");
    }
    return num;
}

int main() {
    bool keepRunning = true;
    while (keepRunning) {
        int validNum;

        // do-while循环:至少执行一次,失败就重试
        do {
            try {
                validNum = getInteger();
                break; // 输入成功,直接跳出循环
            } catch (const std::exception &e) {
                std::cout << "出错啦:" << e.what() << std::endl;
                std::cout << "请重新输入:" << std::endl;
            }
        } while (true);

        // 后续处理逻辑
        std::vector<int> numVec;
        numVec.push_back(validNum);
        std::cout << "有效数字已保存:" << validNum << std::endl;

        // 控制是否继续
        char choice;
        std::cout << "继续输入?(y/n): ";
        std::cin >> choice;
        keepRunning = (choice == 'y' || choice == 'Y');
    }
    return 0;
}

方案说明:

  • do-while循环会先执行一次try块,如果抛出异常,就回到循环开头重新尝试
  • 一旦getInteger()成功返回,就用break跳出do-while循环,进入后续的处理逻辑
  • 这个版本去掉了额外的标志位,代码更紧凑

核心思路总结

不管用哪种方案,核心都是用一个内部循环包裹try-catch块

  • 当捕获到异常时,循环不会退出,而是自动重新执行try块
  • 直到getInteger()成功获取有效输入,才会退出重试循环,继续后续逻辑
  • 完全不需要修改getInteger()函数,只需要在调用它的地方添加重试逻辑

内容的提问来源于stack exchange,提问作者davidlingg2000

火山引擎 最新活动