Ruby => 错误处理与例外

1. 例外处理的写法:

begin
有可能发生例外的处理动作
rescue
例外发生时的处理措施
end

Ruby将例外也视为对象。在rescue后面指定变量名称,可得例外对象。

begin
有可能发生例外的处理动作
rescue => 用来存放例外对象的变量
例外发生时的处理措施
end

即使没有指定变量名称,例外对象也会自动存放到表9.1中所列出的变量里,不过明确指定变量名称程序会比较好懂。
例外发生时会自动设定的变量
[table]
|变量|意义|
|$!|最后发生的例外(例如对象)|
|$@|最后例外所发生的位置相关信息|
[/table]

另外,对例外对象调用如下方法,可获取例外的相关信息。
[table]
|方法名|意义|
|class|例外类别|
|message|例外的消息|
|backtrace|例外的发生位置信息($@等同于!.backtrace)|
[/table]

2. 善后处理

begin
有可能发生例外的处理动作
rescue => 用来存放例外对象的变量
例外发生时的处理措施
ensure
无论例外发生与否都坚持要执行的动作
end



begin
有可能发生例外的处理动作
ensure
无论例外发生与否都坚持要执行的动作
end


3. 重新执行
在rescue语句块里可以使用retry语句重新执行begin语句块的动作。
例如:
在下面的示例中,会每隔10秒重新尝试执行open方法,成功时则返回文件内容。

file = ARGV[0]
begin
io = open(file)
rescue
sleep 10
retry
end
data = io.read
io.close

但要注意文件一直打不开的话,会形成无穷循环。

4. rescue表达式

# -*- coding: utf-8 -*-
=begin
rescue可以作为表达式, 当发生意外时,则返回rescue的值。
=end

# val = "abc" # n => 0
val = 3 # n => 3
n = Integer(val) rescue 0
p n


5. 例外处理补充
当例外处理的begin~end范围就是整个方法本身时,可以省略begin与end,只写rescue与ensure语句块。

6. 例外类
所有例外都是Exception类的子类。
在resure语句块没有指定例外类时,会捕捉StandardError与其子类。
所以自己要定义各种例外类时,一般都会先继承StandardError类,接着再往下继承各种例外类。

7. 引发例外
自己想要让例外发生时,则使用raise方法。

8. catch与throw

def test_throw
throw :test
end

puts "test start"
catch(:test){
puts "before test_throw()"
test_throw
puts "after test_throw()"
}
puts "test end"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值