幾乎所有將字符串解析爲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
時,Ada將處理文本解析。
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;
關於這樣做的好處是,你不必改變你的菜單打印代碼或您的解析代碼時的菜單選項更改列表。
太棒了!非常感謝!但是,我是否需要在函數的循環中另外聲明,開始和結束,還是我可以忽略聲明和開始部分? – Heartinpiece 2011-05-17 02:06:11
哇!下次我在Ada中編程時,我會記住枚舉方法!謝謝! – Heartinpiece 2011-05-17 02:10:06
也許我仍然陷入了過去,但在處理_console_輸入時直接調用枚舉或數字I/O包實例的Get時,我總是有點遺憾。過去的編譯器在處理「清除」交互式輸入緩衝區時,如何處理錯誤的數據輸入方面並不一致。處理這種不一致的是Get_Line/convert成語在幾年前就已經建立起來了,因爲所有的Ada編譯器似乎都至少能夠一直處理Get_Line。但最近可能會變得更好,更一致。 – 2011-05-17 12:14:47