# 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