Error handling 试着用帕斯卡语抓住

Error handling 试着用帕斯卡语抓住,error-handling,try-catch,pascal,Error Handling,Try Catch,Pascal,我使用的是devpas1.9.2,我试图确保当输入符号或字母值时程序不会崩溃 我在谷歌上搜索了又搜索,找不到任何解决方法来实现这一点 非常感谢您的帮助。谢谢 以下是我试图管理输入的代码: Function GetMenuChoice : Integer; Var OptionChosen : Integer; Begin Write('Please enter your choice: '); Readln(OptionChosen); If (Opti

我使用的是devpas1.9.2,我试图确保当输入符号或字母值时程序不会崩溃

我在谷歌上搜索了又搜索,找不到任何解决方法来实现这一点

非常感谢您的帮助。谢谢

以下是我试图管理输入的代码:

 Function GetMenuChoice : Integer;
  Var
    OptionChosen : Integer;
  Begin
    Write('Please enter your choice: ');
    Readln(OptionChosen);
    If (OptionChosen < 1) Or ((OptionChosen > 4) And (OptionChosen <> 9))
      Then
        Begin
          Writeln;
          Writeln('That was not one of the allowed options.  Please try again: ');
        End;
    GetMenuChoice := OptionChosen;
  End;
函数GetMenuChoice:Integer; 变量 OptionChosen:整数; 开始 写('请输入您的选择:'); Readln(选择权); 如果(OptionChosen<1)或(OptionChosen>4)和(OptionChosen 9)) 然后 开始 书面语; Writeln('这不是允许的选项之一。请重试:'); 结束; GetMenuChoice:=OptionChosen; 结束;
将代码改为接受字符;如果出于某种原因需要整数,请稍后处理转换

这在Delphi中工作;除非您不能使用像
['1'..'4','9']
和set操作符这样的集合,否则它应该可以正常工作

Function GetMenuChoice : Char;
Var
  OptionChosen : Char;
Begin
  repeat
    Write('Please enter your choice: ');
    Readln(OptionChosen);

    If not (OptionChosen in ['1'..'4', '9'])
      Then
        Begin
          Writeln;
          Writeln('That was not one of the allowed options.  Please try again: ');
        End;
  until OptionChosen in ['1'..'4', '9'];
  GetMenuChoice := OptionChosen;
End;
如果您确实需要返回一个数字,请将返回类型更改回整数(或字节),然后将最后一行更改为:

GetMenuChoice := Ord(OptionChosen) - 48;  

(除了肯·怀特的)

  • 我认为可以对char类型的变量使用READ,并将用户保存为键入enter

  • 但我会选择字符串类型的版本并使用VAL

    • 这是一种更不可知的编码方式
    • 这一原则超越了价值9
    • 但需要输入,输入过多会弄乱屏幕

  • 对于后者,还有其他方法(例如使用单位Crt或视频),但这可能超出了分配的范围

    您真的要接受四种不同的可能输入吗? (数字1、2、3、4和9) 这就是你现在的要求

    注意:即使像第一个回答者建议的那样进行了更改,您的代码也有一个主要的错误 问题如果给出5或Q,会发生什么。。。你抱怨,然后退出 例行公事

    在原始代码中,如果我输入100,您将打印“这是不允许的”。。。 然后将100返回给调用者

    提示:循环

    提示2:确保不要永远循环

    顺便说一句,从不做:
    ord(某些字符)-48
    相反,请始终使用:
    ord(某些字符)-ord('0')

    为什么??两个明显的原因:

  • 可读性。48是多少

  • 正确性。如果您是在非ASCII系统上编译的,48可能不是 0的字符代码


  • Stan

    在Delphi中,相当于
    try…catch
    的是
    try…except
    。freepascal也一样,turbo pascal也不例外。但是我从来没有听说过DevPascal,所以我不能帮上忙。但是我的建议是读取一个字符串,然后使用像
    Val
    这样的函数来解析它,而一开始就不会抛出异常。我该如何进行编码呢?Devpascal是一个用Delphi编写的IDE,它调用FPC1.9.2(从2004年左右开始)命令行编译器来编译结果。它是使用GCCSTN编译的C++变体的DeVCPP的兄弟姐妹,我的答案接受了<代码> Q>代码>或<代码> A<代码>,并且不退出例程。它也不接受除原始问题所要求的字符
    1
    2
    3
    4
    9
    之外的任何答案。(作为记录,
    数字1、2、3、4和9是5种可能的输入,而不是4.:)我建议也使用
    Ord('0')
    。如果您只寻找单个数字输入(或仅仅是数字输入),编码不可知并不重要
    Char
    (在Pascal的Unicode版本中表示AnsiChar)支持大于“9”的值,enter表示用户输入的结束;使用
    Read
    不允许用户键入错误内容并希望退格/重新键入以修复错误。谢谢!我现在明白了!我还在另一个功能上使用了你的建议。但是我有一个小问题,我已经在这里发布了
    GetMenuChoice := Ord(OptionChosen) - Ord('0');