exception - Ada:获取整数时如何管理 Data_error 异常

标签 exception input integer ada

例如,我试图让用户从菜单中选择一种模式

  1. 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/

相关文章:

.net - 由于命令行参数无效,连接失败

java - Android - 如何将崩溃报告发送到服务器?

python - 如何在python中的输入字段后放置文本?

html - 为什么我的代码找不到来自 mail.com 的登录表单字段?

javascript - 向服务器发送加密数据时 JavaScript 中的 XSS

C 整数安全输入

java - 返回空而不是 null

exception - 如何在 AspectJ 中围绕建议重新抛出异常

c++ - 如何检查整数中是否只设置了一位?

C# 程序卡住在整数列表上