一、常见异常
异常名 | 常见原因 | 怎样抛出 |
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 - $! #表示异常信息
- [email protected] #表示异常出现的代码位置
- else #其余异常
- ..
- ensure #不管有没有异常,进入该代码块
- end #结束
可以结合$!错误原因,和[email protected]错误位置做一个错误捕获并提示的小程序,比如:
- 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:#{[email protected]}"
- ensure
- file.close
- end
时间: 2024-10-18 00:00:10