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

Hea*_*ece 2 integer exception input ada

我试图让用户从菜单中选择一个模式

  1. 睡觉

现在我可以使用该调用获得整数输入

ada.integer_text_io.get(integer_variable);
Run Code Online (Sandbox Code Playgroud)

这里的主要问题是,如果我插入非数字字符串(例如字符串),则会引发以下异常

raised ADA.IO_EXCEPTIONS.DATA_ERROR : a-tiinio.adb:89 instantiated at a-inteio.ads:18
Run Code Online (Sandbox Code Playgroud)

我已经尝试接收一个字符,检查它是否是一个整数,然后将其转换为整数,但后来我意识到我需要得到大于1位整数的输入,所以字符方法将无法工作.

如果我收到一个字符串,那么我无法检查它是否是一个整数(除非我扫描整个字符串以查看它的所有字符是否都是整数...)

除扫描整个字符串外还有其他解决方案吗?或者可能是一种异常处理技术,可能会阻止程序终止并再次询问正确的整数?

-CH

T.E*_*.D. 5

几乎所有在Ada中将字符串解析为某种标量值的标准方法都会在读取无效字符串时产生某种异常.这没有任何问题.只需处理异常.

即使您编写了自己的字符串解析为整数例程,您也必须以某种方式处理用户输入无效字符串的情况.对?

我想唯一涉及的"技术"是你可以将异常处理程序放在子程序上,甚至放在declare ... begin ... end你在代码中内联的块上.这样,只有块中的代码被中止.通常我更喜欢看到使用的子程序.所以你会得到类似的东西:

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;
Run Code Online (Sandbox Code Playgroud)

现在,就这种情况而言,对于快速而肮脏的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;
Run Code Online (Sandbox Code Playgroud)

关于这一点的好处是,当菜单选项列表发生变化时,您不必更改菜单打印代码或解析代码.