begin num = 0 de = 0 value = num/de rescue ZeroDivisionError => ex puts "error,divede zero" # error,divede zero puts ex # divided by 0 puts ex.class # ZeroDivisionError puts ex.class.superclass # StandardError puts ex.class.superclass.superclass # Exception puts ex.class.superclass.superclass.superclass # Object ensure puts "over" # over end
在异常产生后,如果相应的rescue语句被匹配到,那么这个异常对象会被复制到ex中,而ensure后的代码永远都会被执行到。
ruby里,异常类的基类是Exception。
recuse不加参数默认是匹配StandardError类型的异常。
当抛出一个异常时,可以使用Ruby内置的异常类,也可以自定义自己的异常类。如果使用自定义的异常类,那么这个异常类应该是StandardError类直接或间接的子类。如果不这么做,那么默认情况下,这个异常不能正确地被捕捉。