Ruby 中的異常知識點總結

# 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
相關文章
相關標籤/搜索