异常名 |
常见原因 |
怎样抛出 |
RuntimeError |
raise抛出的默认异常 |
raise |
NoMethodError |
对象找不到对应的方法 |
a=Oject.new
a.jackmethod |
NameError |
解释器碰到一个不能解析为变量或方法名的标识符 |
a=jack |
IOError |
读关闭的流,写只读的流,或类似的操作 |
STDIN.puts("不能写入") |
Errno::error |
与文件IO相关的一类错误 |
File.open(-10) |
TypeError |
方法接受到它不能处理的参数 |
a=3+"abc" |
ArgumentError |
传递参数的数目出错 |
def o(x) end o(1,2,3) |
二、捕获异常
用rescue捕获异常
#用rescue捕获异常
begin
result=20/0
puts result
rescue ZeroDivisionError
puts "Zero Error"
rescue
puts "Unknow error"
end
输出:Zero Error
三、raise抛出异常
def divide(x)
raise ArgumentError if x==0
end
begin
divide(0)
rescue ArgumentError
puts "ArgumentError"
end
输出:ArgumentError
四、异常保存到变量
def divide(x)
raise ArgumentError if x==0
end
begin
divide(0)
rescue =>e
puts e.to_s
end
输出:ArgumentError
五、创建异常类
class ThrowExceptionL<Exception
puts "Error L"
end
begin
raise ThrowExceptionL,"got error"
rescue ThrowExceptionL=>e
puts "Error #{e}"
end
输出:
Error L
Error got error
Ruby异常处理结构代码示例:
- begin #开始
- raise.. #抛出异常
- rescue [ExceptionType =
StandardException]
#捕获指定类型的异常 缺省值是StandardException
- $! #表示异常信息
- $@ #表示异常出现的代码位置
- else #其余异常
- ..
- ensure #不管有没有异常,进入该代码块
- end #结束
可以结合$!错误原因,和$@错误位置做一个错误捕获并提示的小程序,比如:
- begin
- puts
- puts "file: #{name = ARGV.shift}"
- file = open(name)
- i = 0
- file.read.each_line
{|line| puts "#{i+=1}.#{line}" }
- rescue
- puts "error:#{$!} at:#{$@}"
- ensure
- file.close
- end