乙個執行著的程式常會遇到意外的問題.乙個要讀取的檔案不存在;當希望存入一些資料時磁碟滿了;使用者可能輸入不恰當的資料.
ruby> file = open("some_file")
err: (eval):1:in `open': no such file or directory - some_file
乙個健壯的程式會合理並漂亮的處理這些問題.面對那些異常是一件討人厭的工作.c程式設計師被要求做到檢查每乙個可能導致錯誤發生的系統呼叫的返回值並立刻做出決定.
file *file = fopen("some_file", "r");
if (file == null)
bytes_read = fread( buf, 1, bytes_desired, file );
if (bytes_read != bytes_desired )
...
這項無聊的工作會使程式設計師最終變得馬虎並忽略掉它,結果是程式無法應對異常.令一方面,這樣也會降低程式的可讀性.因為過多的錯誤處理使有意義的**也變得雜亂了.
在ruby裡,就像其它的現代語言,我們可以通過隔離的辦法處理**域裡的異常,因此,這有著驚人的效果卻又不會為程式設計師或以後希望讀它的其它人造成過度的負擔.**域由begin開始直到遇到乙個異常,這將導致轉向乙個由rescue標記的錯誤處理**域.如果異常沒發生,rescue**就不會使用.下面的**返回文字檔案的第一行,如果有異常則返回 nil.
def first_line( filename )
begin
file = open("some_file")
info = file.gets
file.close
info # last thing evaluated is the return value
rescue
nil # can't read the file? then don't return a string
end
end
有時我們會希望圍繞問題展開創造性工作.這裡,如果檔案不存在,我們用標準輸入代替:
begin
file = open("some_file")
rescue
file = stdin
end
begin
# ... process the input ...
rescue
# ... and deal with any…………………………………………………………………………
原文:
ruby 異常處理
size large 異常處理在程式中的作用理解 size 1.改變執行過程 丟擲異常後,就可以處理當前異常,使得程式馬上走異常處理分支,改變了主程式的執行邏輯 2.程式更加健壯 往往有很多邊界條件,開發或者設計的時候沒有考慮到,只有在除錯的過程中發現,因此發現這些邊界,然後新增異常處理,就更加能夠...
ruby 異常處理 ensure
當乙個方法結束工作時我們也許需要進行清理工作.也許乙個開啟的檔案需要關閉,緩衝區的資料應清空等等.如果對於每乙個方法這裡永遠只有乙個退出點,我們可以心安理得地將我們的清理 放在乙個地方並知道它會被執行 但乙個方法可能從多個地方返回,或者因為異常我們的清理 被意外跳過.begin file open ...
ruby 異常處理 ensure
當乙個方法結束工作時我們也許需要進行清理工作.也許乙個開啟的檔案需要關閉,緩衝區的資料應清空等等.如果對於每乙個方法這裡永遠只有乙個退出點,我們可以心安理得地將我們的清理程式碼放在乙個地方並知道它會被執行 但乙個方法可能從多個地方返回,或者因為異常我們的清理程式碼被意外跳過.begin file o...