例如,我试图让用户从菜单中选择一种模式
- 吃
- 喝
- sleep
现在我可以通过调用获取整数输入
ada.integer_text_io.get(integer_variable);
这里的主要问题是,如果我插入非数字字符串(例如字符串),则会引发以下异常
raised ADA.IO_EXCEPTIONS.DATA_ERROR : a-tiinio.adb:89 instantiated at a-inteio.ads:18
我尝试过接收一个字符,检查它是否是整数,然后将其转换为整数,但后来我意识到我需要获取大于1位的整数的输入,因此字符方法不起作用.
如果我收到一个字符串,那么我无法检查它是否是整数(除非我扫描整个字符串以查看其所有字符是否都是整数...)
除了扫描整个字符串之外还有其他解决方案吗? 或者也许是一种异常处理技术,可以防止程序终止并再次要求正确的整数?
-CH
最佳答案
当/如果读取无效字符串时,几乎所有在 Ada 中将字符串解析为某种标量值的标准方法都会产生某种异常。这并没有什么问题。只需处理异常即可。
即使您将自己的字符串解析编写为整数例程,您也必须以某种方式处理用户输入无效字符串的情况。对吗?
我猜涉及的唯一“技术”是您可以将异常处理程序放在子例程上,甚至可以放在代码中内联的 declare ... begin ... end
block 上。这样,只有 block 内的代码会被中止。一般来说,我更喜欢看到使用子例程。所以你会得到类似的东西:
function User_Integer return Integer is
begin
loop
begin
ada.integer_text_io.get(integer_variable);
return integer_variable;
exception
when ADA.IO_EXCEPTIONS.DATA_ERROR =>
Ada.Text_IO.Put_Line ("Try a number from 1 to 3, Sherlock");
Print_Menu;
end;
end loop;
end User_Integer;
现在,情况就是这样,对于快速而肮脏的 Ada 菜单,我通常不会像上面那样使用数字菜单。相反,创建一个枚举类型。这样,您可以在菜单类型循环中使用 'image
打印菜单选项,当您使用 'value
或 时,Ada 将处理文本解析Ada.Text_IO.Enumeration_IO
。
type Menu_Selection_Option is (Eat, Drink, Sleep);
package Menu_IO is new Ada.Text_IO.Enumeration_IO (Menu_Selection_Option);
function User_Selection return Integer is
begin
loop
declare
Selection : Menu_Selection_Option;
begin
Menu_IO.Get(Selection);
return Selection;
exception
when ADA.IO_EXCEPTIONS.DATA_ERROR =>
Ada.Text_IO.Put_Line ("Unrecognized option. Try again Sherlock");
Print_Menu;
end;
end loop;
end User_Selection;
这样做的好处是,当菜单选项列表更改时,您不必更改菜单打印代码或解析代码。
关于exception - Ada:获取整数时如何管理 Data_error 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6019466/