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"时,程序会:
- 识别
taco为ID,输出ID - 识别
taco1时发现数字1,抛出异常,捕获后输出[Invalid ID: 1 found] - 跳过当前无效项,继续处理下一个
taco1,输出[Invalid ID: 1 found]
最终得到预期输出:ID [Invalid ID: 1 found] [Invalid ID: 1 found]
内容的提问来源于stack exchange,提问作者Doug Paul
相关产品推荐
相关产品推荐

