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

输入非整数时程序异常终止及相关错误修复咨询

修复:输入非整数时程序崩溃并提示"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;
}

错误原因分析

  1. throw;的错误使用:throw;仅能在catch块中重新抛出当前活跃的异常,在try块中直接调用时,无活跃异常存在,会触发C++标准库的terminate()函数,导致程序直接崩溃。
  2. catch块语法错误:原代码中catch(...)未用大括号包裹所有处理语句,仅第一条cout属于异常处理逻辑,后续代码无法在异常触发时执行。
  3. 逻辑顺序问题:先调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:01:36