You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++异常抛出功能异常:无法批量输出多个错误信息

解决多无效输入的错误输出问题

核心问题分析

原程序的问题在于抛出异常后直接终止流程,无法继续处理后续输入项。比如遇到第一个taco1抛出异常后,程序直接停止,没法处理第二个taco1。

具体修改方案

1. 调整异常处理逻辑

不要让词法分析的核心识别函数抛出异常后直接终止程序,而是在主循环中捕获异常并记录错误信息,之后继续处理下一个输入单元。

2. 修改主流程代码

假设原主流程代码类似这样:

// 原错误主流程
while (还有未处理输入) {
    Token token = lexer.nextToken(); // 遇无效输入直接抛异常终止
    // 处理有效token
}

改成如下逻辑:

// 修改后的主流程
while (还有未处理输入) {
    try {
        Token token = lexer.nextToken();
        // 输出有效token类型,比如ID
        std::cout << token.type << " ";
    } catch (const SampleEx& e) {
        // 捕获异常并输出错误,不终止循环
        std::cout << "[" << e.what() << "] ";
    }
}
std::cout << std::endl;

3. 修正词法分析器的状态维护

每次捕获异常后,要确保词法分析器跳过当前无效输入单元,避免陷入死循环。比如在nextToken函数中,发现无效内容时,将指针移动到下一个分隔符(如空格)之后:

Token Lexer::nextToken() {
    // 跳过空白字符
    skipWhitespace();
    if (isEnd()) {
        return Token{END};
    }

    char c = peek();
    if (isalpha(c)) {
        std::string id = readID();
        // 检查ID是否含数字
        for (char ch : id) {
            if (isdigit(ch)) {
                // 跳过当前无效项的剩余字符
                while (!isEnd() && !isspace(peek())) {
                    advance();
                }
                throw SampleEx("Invalid ID: " + std::string(1, ch) + " found");
            }
        }
        return Token{ID, id};
    } else if (isdigit(c) || c == '.') {
        // 数字识别逻辑同理,异常时需跳过当前无效项
        // ...
    } else {
        // 处理其他无效字符,移动指针
        advance();
        throw SampleEx("Invalid character: " + std::string(1, c));
    }
}

效果验证

输入"taco taco1 taco1"时,程序会:

  1. 识别taco为ID,输出ID
  2. 识别taco1时发现数字1,抛出异常,捕获后输出[Invalid ID: 1 found]
  3. 跳过当前无效项,继续处理下一个taco1,输出[Invalid ID: 1 found]
    最终得到预期输出:ID [Invalid ID: 1 found] [Invalid ID: 1 found]

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:30:47