# 1 異常發生後 程序會暫時中止運行 並尋找是否有對應的異常處理程序 # 2 在Ruby中 異常也是對象 在rescue後指定變量名 能夠得到異常對象 # 3 異常對象的方法有 class message backtrace # 4 Ruby中的ensure至關於Java中的finally # 5 在Ruby中 指定retry時候必定要小心死循環 # 例子 判斷 字符串 是否爲數值形式 puts n = Integer('123') rescue 0 # 6 若是整個方法內的程序都用begin ~ end括起來的話 則可省略 begin ~ end 直接寫rescue 與 ensure # 7 也可在類定義中使用 rescue 和 ensure 可是不推薦 由於有異常發生後 異常發生位置以後的方法就再也不執行了 # 8 Ruby中全部異常都是Exception類的子類 # 9 RunTimeException 官方定義是無效的操做會返回RunTimeException # 10 rescue中指定的異常種類就是異常類類名 rescue不指定異常類時 # 返回RunTimeException 默認捕捉StandardError類及其子類 # 11 自定義異常 通常會先定義繼承StandError 而後再繼承這個新類 MyError = Class.new(StandardError) a = 0 def bar x if x == 0 raise MyError,'this is my error' # 拋出異常 以及信息 end end begin bar(0) rescue MyError => e puts e.class # 異常類型爲MyError puts e.class.superclass # 父類爲StandardError puts e.message # 信息爲'this is my error' puts e.backtrace# '打印了 堆棧信息' puts '發生異常啦' end # 12 帶有claller的效果與backtrace 類似 def foo begin raise TypeError, 'Boom in foo', caller rescue =>e puts e.send(:caller) end end foo # 12 例 def factorial(n) raise TypeError unless n.is_a?(Integer) #若是不是Integer類型則raise TypeError raise ArgumentError if n < 1 return 1 if n == 1 n*factorial(n - 1) end begin x = factorial(12) rescue TypeError => e puts 'pls input Integer' rescue ArgumentError => e puts 'pls input >0' else puts "正常輸出結果#{x}" #若是抓取到了異常則else中的不執行了 ensure puts 'processed' end # 13 異常的傳播機制 # 1 先是包含他block 的rescue # 2 沒有的話 包含 block 的 block 有沒有rescue # 3 沒有的話看 block的caller # 4 他caller的caller