【问题标题】:MatLab: Error handling of integer inputMatLab:整数输入的错误处理
【发布时间】:2026-02-10 14:15:02
【问题描述】:

我如何在 MatLab 中捕获当用户在输入中输入字母和其他不是数字的内容时发生的错误:

width = input('Enter a width: ');

我用try/catch 命令玩了一段时间:

width = 0;
message = '';

% Prompting.
while strcmp(message,'Invalid.') || width < 1 || width ~= int32(width)

  try
     disp(message)
     width = input('Frame width: ');
  catch error
     message = 'Invalid.';
  end

end

但是没有运气(以上不起作用)。如图所示,我想要一个简单的消息,例如“框架宽度:”,以便用户第一次输入他的选择。但是,如果发现错误,我希望他的消息是“无效的。再试一次:”每次发生错误时 fx。

我也尝试过error(),但我不知道如何正确放置它。由于error() 没有将发生错误的input 命令作为参数,因此它必须以另一种方式检测它,我无法理解。

任何帮助将不胜感激。

【问题讨论】:

    标签: matlab error-handling try-catch user-input validation


    【解决方案1】:
    width = input('Frame width: ');
    while(~isInt(width))
        width = input('Invalid. Try again: ');
    end
    

    你必须在某处(或它的另一个实现)拥有以下功能

    function retval = isInt(val)
        retval = isscalar(val) && isnumeric(val) && isreal(val) && isfinite(val) && (val == fix(val));
    end
    

    【讨论】:

    • +1。我会注意到,您可以在其中添加 isscalar 而不是 if/else 声明。
    • 当我输入一个字母时它不起作用......错误发生在width = input('Frame width: ');的行。似乎当输入一个字母(或任何字符串)时,这里会发生错误,因为input() 没有要求输入字符串。然后程序永远不会到达while 循环。相反,它在这一行中断。
    • @Steeven 如果你输入一个带有' ' 的字符串,会发生什么?如果您不包含该字符串,它会认为您正在尝试从工作区输入一个变量并评估该变量。如果发生错误,它应该只是再次提示而不是完全中断
    • 那么,如果我想避免input()'s' 参数,我必须在输入字符串周围添加撇号吗?这对用户来说不是用户友好的。那么是否无法捕获由于发送字符串而发生的错误?
    • 只有撇号用于字符串,就像在您的普通代码中一样:4 是整数,4.5 是双精度,a 是变量,'b' 是字符串。你总是可以使用's' 参数来定义你的输入是always一个字符串..但是因为你避免了这个,我想我们被卡住了..
    【解决方案2】:
    answer = input('Frame width: ', 's');
    [width, status] = str2num(answer);
    while ~status || ~isscalar(width) || width ~= floor(width)
      answer = input('Invalid. Try again: ', 's');
      [width, status] = str2num(answer);
    end
    disp(width);
    

    (如果转换失败,status 为 0。如果没有 isscalar 测试,也会接受类似 [1 2; 3 4] 的输入。最后一个测试确保宽度必须是整数。)

    【讨论】:

    • 您可能还需要确保不允许使用小数部分(标题表明需要整数输入)。
    • 不幸的是,我需要避免在 input() 命令中使用 's' 参数。我正在寻找一种解决方案来在不使用此参数时捕获错误。
    • 有趣。为什么你需要避免's'?需要将输入作为字符串处理。通常的做法是将用户输入作为字符串接收,然后尝试对其进行转换并在第二步中检查转换结果。
    • 看来我不得不屈服了。我深信。当's' 无法避免时,您的回答就成功了。