今天小編跟大家分享一篇在ruby里,異常處理之rescue的相關知識,感興趣的朋友跟小編一起來了解一下吧!
一個運行著的程序常會遇到意外的問題.一個要讀取的文件不存在;當希望存入一些數據時磁盤滿了;用戶可能輸入不恰當的數據.
ruby>file=open("some_file")
ERR:(eval):1:in`open':Nosuchfileordirectory-some_file
一個健壯的程序會合理并漂亮的處理這些問題.面對那些異常是一件討人厭的工作.C程序員被要求做到檢查每一個可能導致錯誤發生的系統調用的返回值并立刻做出決定.
FILE*file=fopen("some_file","r");
if(file==NULL){
fprintf(stderr,"Filedoesn'texist./n");
exit(1);
}
bytes_read=fread(buf,1,bytes_desired,file);
if(bytes_read!=bytes_desired){
/*domoreerrorhandlinghere...*/
}
...
這項無聊的工作會使程序員最終變得馬虎并忽略掉它,結果是程序無法應對異常.令一方面,這樣也會降低程序的可讀性.因為過多的錯誤處理使有意義的代碼也變得雜亂了.
在Ruby里,就像其它的現代語言,我們可以通過隔離的辦法處理代碼域里的異常,因此,這有著驚人的效果卻又不會為程序員或以后希望讀它的其它人造成過度的負擔.代碼域由begin開始直到遇到一個異常,這將導致轉向一個由rescue標記的錯誤處理代碼域.如果異常沒發生,rescue代碼就不會使用.下面的代碼返回文本文件的第一行,如果有異常則返回nil.
deffirst_line(filename)
begin
file=open("some_file")
info=file.gets
file.close
info#Lastthingevaluatedisthereturnvalue
rescue
nil#Can'treadthefile?thendon'treturnastring
end
end
有時我們會希望圍繞問題展開創造性工作.這里,如果文件不存在,我們用標準輸入代替:
begin
file=open("some_file")
rescue
file=STDIN
end
begin
#...processtheinput...
rescue
#...anddealwithanyotherexceptionshere.
end
retry用于rescue代碼表示又重新執行begin代碼.這讓我們可以壓縮前面的例子:
fname="some_file"
begin
file=open(fname)
#...processtheinput...
rescue
fname="STDIN"
retry
end
但這仍有一點瑕疵.一個不存在的文件將導致不停止地retry.你在使用retry做異常處理時應注意到這一點.
每個Ruby庫在遇到錯誤時都會提交一個異常,你可以在自己的代碼里明確地提交異常.用raise來提交異常.它帶一個參數,也就是描述異常的一個字符串.參數是可選的但不應被省略.之后它可以通過一個特殊的全局變量$!訪問.
ruby>raise"testerror"
testerror
ruby>begin
|raise"test2"
|rescue
|print"Anerroroccurred:",$!,"/n"
|end
Anerroroccurred:test2
nil
以上就是在ruby里,異常處理之rescue的相關知識,想必都了解了吧,更多相關內容請繼續關注武林技術頻道。
新聞熱點
疑難解答
圖片精選