输入非整数时程序异常终止及相关错误修复咨询
修复:输入非整数时程序崩溃并提示"terminate called without an active exception"
当程序输入非整数内容时,会直接终止并抛出错误:
terminate called without an active exception
相关代码及函数实现如下:
原调用代码
try{ cout << "Please enter option (1-" << NUMBER_OF_OPTIONS << "): "; getline(cin, input); userOption = stoi(input); if(!helper.isWholeNumber(input)) { throw; } } catch(...) cout << "Error: Input Invalid" << endl; helper.pressEnterToContinue(); return false; }
isWholeNumber实现方式1
bool Helper::isWholeNumber(const string &stringToCheck) const { for(int i = 0; i < stringToCheck.length(); i++){ if(!isdigit(stringToCheck[i])){ return false; } } return true; }
isWholeNumber实现方式2(仍会崩溃)
bool Helper::isWholeNumber(const string &stringToCheck) const { bool success = true; for(int i = 0; i < stringToCheck.length(); i++){ if(!isdigit(stringToCheck[i])){ success = false; } } return success; }
错误原因分析
throw;的错误使用:throw;仅能在catch块中重新抛出当前活跃的异常,在try块中直接调用时,无活跃异常存在,会触发C++标准库的terminate()函数,导致程序直接崩溃。catch块语法错误:原代码中catch(...)未用大括号包裹所有处理语句,仅第一条cout属于异常处理逻辑,后续代码无法在异常触发时执行。- 逻辑顺序问题:先调用
stoi再检查字符串是否为纯数字,会导致部分有效但不符合要求的输入(如"123a")被stoi转换为整数,但后续检查不通过时触发错误的throw;。
修复方案及代码示例
1. 修正调用代码
#include <stdexcept> // 需包含此头文件使用标准异常类型 try{ cout << "Please enter option (1-" << NUMBER_OF_OPTIONS << "): "; getline(cin, input); // 先检查是否为纯数字,再执行转换 if(!helper.isWholeNumber(input)) { throw std::invalid_argument("Invalid whole number"); } userOption = stoi(input); // 额外检查输入是否在选项范围内 if(userOption < 1 || userOption > NUMBER_OF_OPTIONS) { throw std::out_of_range("Option out of range"); } } catch(const std::exception& e){ cout << "Error: Input Invalid" << endl; helper.pressEnterToContinue(); return false; } // 若需捕获所有异常,可保留catch(...),但建议优先捕获具体异常类型
2. 优化isWholeNumber实现(保留核心逻辑,添加边界检查)
bool Helper::isWholeNumber(const string &stringToCheck) const { // 处理空字符串情况 if(stringToCheck.empty()) { return false; } // 使用范围for循环更简洁 for(char c : stringToCheck){ if(!isdigit(c)){ return false; } } return true; }
3. (可选)支持带正负号的整数
若需要允许输入带正负号的整数,可修改isWholeNumber:
bool Helper::isWholeNumber(const string &stringToCheck) const { if(stringToCheck.empty()) { return false; } int startIndex = 0; // 允许开头的正负号 if(stringToCheck[0] == '+' || stringToCheck[0] == '-') { startIndex = 1; // 仅输入正负号无数字的情况返回false if(stringToCheck.length() == 1) { return false; } } for(int i = startIndex; i < stringToCheck.length(); i++){ if(!isdigit(stringToCheck[i])){ return false; } } return true; }
内容的提问来源于stack exchange,提问作者Incorrect.PleaseTryAgain
相关产品推荐
相关产品推荐

