The example here shows how you can read a value representing a day of the week from the user and be guaranteed that something appropriate is typed. If something invalid is entered, the procedure reports the error and gives the user another chance.
type week_days is ( Mon, Tue, Wed, Thu, Fri, Sat, Sun );
subtype work_days is week_days range Mon .. Fri;
subtype weekend_days is week_days range Sat .. Sun;
procedure safe_get_day (out_day : out week_days;
min : in week_days := week_days'FIRST;
max : in week_days := week_days'LAST ) is
-- procedure for the safe input of enumeration values
local_day : week_days; -- local input var
good_day : BOOLEAN := FALSE; -- loop control
begin -- safe_get_day
while not good_day loop
begin -- while block
PUT("Enter an day between ");
PUT( min ); PUT(" and "); PUT( max ); PUT(" ");
GET( local_day );
-- this point is reached only when input is a day code
if (local_day < min) or else (local_day > max) then
raise DATA_ERROR;
else
good_day := TRUE;
end if;
-- this point is reached if input is a valid day code
-- between min and max
exception
when DATA_ERROR =>
PUT_LINE("Invalid day!. Good days are ");
for this_day in week_days range min .. max loop
PUT( this_day ); PUT(" ");
end loop;
NEW_LINE; SKIP_LINE; -- tidy up terminal
end; -- protected while block
end loop;
-- this point can only be reached when valid value input
SKIP_LINE; -- tidy up terminal handling
out_day := local_day; -- export input value
end safe_get_day;