一、常见ruby异常信息:
异常名 | 常见原因 | 怎样抛出 |
RuntimeError | raise抛出的默认异常 | raise |
NoMethodError | 对象找不到对应的方法 | a=Oject.new |
NameError | 解释器碰到一个不能解析为变量或方法名的标识符 | a=jack |
IOError | 读关闭的流,写只读的流,或类似的操作 | STDIN.puts("不能写入") |
Errno::error | 与文件IO相关的一类错误 | File.open(-10) |
TypeError | 方法接受到它不能处理的参数 | a=3+"abc" |
ArgumentError | 传递参数的数目出错 | def o(x) end |
二、格式
参照java的异常处理。
try{ -------------- begin
}catch(){ ---------rescue
}finally{ ---------ensure
} ----------------end
可能会出现的异常信息包含在begin、end之间。
指定异常跟在rescue之后,当然可以缺省使用默认。rescue和else配对使用,else就是不是指定异常或者是没有异常。
ensure等同于java中的finally,不多做解释。
两个重要变量:$!:异常的描述信息、$@:异常出现的位置。
看个例子:
if __FILE__ == $0
a = 10
b = 20
c = 0
begin
ad=a/b
ac=a/c
rescue
puts "有异常 #{$!}, 位置:#{$@}"
else
puts "没有异常"
ensure
puts "进入类finally区"
end
end
执行结果:
有异常 divided by 0, 位置:exception.rb:15:in `/'exception.rb:15
进入类finally区
三、异常信息保存到变量
使用:rescue => e
打印:puts e.to_s
借用上面的例子,rescue替换成如下:
rescue => e
puts "有异常 #{$!}, 位置:#{$@}"
puts e.to_s+"....."
执行结果:
有异常 divided by 0, 位置:exception.rb:15:in `/'exception.rb:15
divided by 0.....
进入类finally区