異常和執行總是被聯系在一起。如果您打開一個不存在的文件,且沒有恰當地處理這種情況,那么您的程序則被認為是低質量的。
如果異常發生,則程序停止。異常用于處理各種類型的錯誤,這些錯誤可能在程序執行期間發生,所以要采取適當的行動,而不至于讓程序完全停止。
Ruby 提供了一個完美的處理異常的機制。我們可以在 begin/end 塊中附上可能拋出異常的代碼,并使用 rescue 子句告訴 Ruby 完美要處理的異常類型。
語法
begin # - rescue OneTypeOfException # - rescue AnotherTypeOfException # - else # 其他異常ensure# 總是被執行end
從 begin 到 rescue 中的一切是受保護的。如果代碼塊執行期間發生了異常,控制會傳到 rescue 和 end 之間的塊。
對于 begin 塊中的每個 rescue 子句,Ruby 把拋出的異常與每個參數進行輪流比較。如果 rescue 子句中命名的異常與當前拋出的異常類型相同,或者是該異常的父類,則匹配成功。
如果異常不匹配所有指定的錯誤類型,我們可以在所有的 rescue 子句后使用一個 else 子句。
實例
#!/usr/bin/ruby begin file = open("/unexistant_file") if file puts "File opened successfully" endrescue file = STDINendprint file, "==", STDIN, "/n"
這將產生以下結果。您可以看到,STDIN 取代了 file ,因為打開失敗。
#<IO:0xb7d16f84>==#<IO:0xb7d16f84>
使用 retry 語句
您可以使用 rescue 塊捕獲異常,然后使用 retry 語句從開頭開始執行 begin 塊。
語法
begin # 這段代碼拋出的異常將被下面的 rescue 子句捕獲rescue # 這個塊將捕獲所有類型的異常 retry # 這將把控制移到 begin 的開頭end實例#!/usr/bin/ruby begin file = open("/unexistant_file") if file puts "File opened successfully" endrescue fname = "existant_file" retryend
以下是處理流程:
注意:如果被重新命名的文件不存在,本勢力代碼會無限嘗試。所以異常處理時,謹慎使用 retry。
使用 raise 語句
您可以使用 raise 語句拋出異常。下面的方法在調用時拋出異常。它的第二個消息將被輸出。
語法
raise OR raise "Error Message" OR raise ExceptionType, "Error Message" OR raise ExceptionType, "Error Message" condition
第一種形式簡單地重新拋出當前異常(如果沒有當前異常則拋出一個 RuntimeError)。這用在傳入異常之前需要解釋異常的異常處理程序中。
新聞熱點
疑難解答