一、常見ruby異常資訊:
異常名 |
常見原因 |
怎樣拋出 |
RuntimeError |
raise拋出的預設異常 |
raise |
NoMethodError |
對象找不到對應的方法 |
a=Oject.new a.jackmethod |
NameError |
解譯器碰到一個不能解析為變數或方法名的標識符 |
a=jack |
IOError |
讀關閉的流,寫唯讀流,或類似的操作 |
STDIN.puts("不能寫入") |
Errno::error |
與檔案IO相關的一類錯誤 |
File.open(-10) |
TypeError |
方法接受到它不能處理的參數 |
a=3+"abc" |
ArgumentError |
傳遞參數的數目出錯 |
def o(x) end o(1,2,3) |
二、格式
參照java的異常處理。
try{ -------------- begin}catch(){ ---------rescue }finally{ ---------ensure} ----------------end
可能會出現的異常資訊包含在begin、end之間。
指定異常跟在rescue之後,當然可以預設使用預設。rescue和else配對使用,else就是不是指定異常或者是沒有異常。
ensure等同於java中的finally,不多做解釋。
兩個重要變數:$!:異常的描述資訊、$@:異常出現的位置。
看個例子:
if __FILE__ == $0 a = 10 b = 20 c = 0 begin ad=a/b ac=a/c rescue puts "有異常 #{$!}, 位置:#{$@}" else puts "沒有異常" ensure puts "進入類finally區" endend
執行結果:
有異常 divided by 0, 位置:exception.rb:15:in `/'exception.rb:15
進入類finally區
三、異常資訊儲存到變數
使用:rescue => e
列印:puts e.to_s
借用上面的例子,rescue替換成如下:
rescue => e puts "有異常 #{$!}, 位置:#{$@}" puts e.to_s+"....."
執行結果:
有異常 divided by 0, 位置:exception.rb:15:in `/'exception.rb:15
divided by 0.....
進入類finally區