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

 

转载于:https://my.oschina.net/u/3544267/blog/1574651

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值