標籤:
一、常見異常
異常名 |
常見原因 |
怎樣拋出 |
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) |
二、捕獲異常用rescue捕獲異常#用rescue捕獲異常begin result=20/0puts resultrescue ZeroDivisionErrorputs "Zero Error"rescueputs "Unknow error"end輸出:Zero Error 三、raise拋出異常def divide(x)raise ArgumentError if x==0end begindivide(0)rescue ArgumentErrorputs "ArgumentError"end輸出:ArgumentError 四、異常儲存到變數def divide(x)raise ArgumentError if x==0end begindivide(0)rescue =>eputs e.to_send輸出:ArgumentError 五、建立異常類class ThrowExceptionL<Exceptionputs "Error L"end beginraise ThrowExceptionL,"got error"rescue ThrowExceptionL=>eputs "Error #{e}"end 輸出:Error LError got error
Ruby異常處理結構程式碼範例:
- begin #開始
- raise.. #拋出異常
- rescue [ExceptionType =
StandardException]
#捕獲指定類型的異常 預設值是StandardException
- $! #表示異常資訊
- [email protected] #表示異常出現的代碼位置
- else #其餘異常
- ..
- ensure #不管有沒有異常,進入該代碼塊
- end #結束
可以結合$!錯誤原因,和[email protected]錯誤位置做一個錯誤捕獲並提示的小程式,比如:
- begin
- puts
- puts "file: #{name = ARGV.shift}"
- file = open(name)
- i = 0
- file.read.each_line
{|line| puts "#{i+=1}.#{line}" }
- rescue
- puts "error:#{$!} at:#{[email protected]}"
- ensure
- file.close
- end
ruby錯誤處理和異常