Практически все стандартные способы анализа строки в скалярное значение некоторого вида в 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;
Теперь, в этом случае для быстрых и грязных меню Ады я обычно не делаю числовые меню, как указано выше.Вместо этого создайте перечислимый тип.Таким образом, вы можете распечатать пункты меню, используя 'image
в цикле по типу меню, и Ада будет обрабатывать анализ текста при использовании 'value
или 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;
NiceДело в том, что вам не нужно менять код печати меню или код синтаксического анализа при изменении списка параметров меню.