ruby中的异常处理机制分析

ruby是一门动态脚本语言,这个大家都知道。

我今天想讨论的问题是ruby中的异常处理机制,首先贴一段代码:

 1  class SocketError  <  StandardError  
 2  end
 3 
 4  class Test
 5     @host   =   " 192.168.0.1 "
 6     @port   =   8000
 7    def opensocket
 8      ret_str  =   " socket open Fail "
 9      begin
10         socket   =  TCPSocket . open ( @host , @port )
11        ret_str  =   " socket open successed! "
12      rescue  =>  e
13        puts  " socket error "
14        raise SocketError 
15      end 
16       return  ret_str
17    end
18  end
19 
20  # ############################
21  =  Test . new
22  begin
23    str  =  t . opensocket()
24    puts str
25  rescue SocketError
26    puts  " socket open fail  in opensocket method "
27  end
28  # ############################

这段代码打印的结果大家都应该会知道:

socket error
socket open fail  in opensocket method
在看下下面的这段代码

 

 1  class SocketError  <  StandardError  
 2  end
 3 
 4  class Test
 5     @host   =   " 192.168.0.1 "
 6     @port   =   8000
 7    def opensocket
 8      ret_str  =   " socket open Fail "
 9      begin
10         socket   =  TCPSocket . open ( @host , @port )
11        ret_str  =   " socket open successed! "
12      rescue  =>  e
13        puts  " socket error "
14        raise SocketError 
15      ensure
16         return  ret_str
17      end 
18    end
19  end
20 
21  # ############################
22  =  Test . new
23  begin
24    str  =  t . opensocket()
25    puts str
26  rescue SocketError
27    puts  " socket open fail  in opensocket method "
28  end
29  # ############################
30 
31 

大家说这段代码返回的是什么?

还是和上面的代码返回的结果一致么?

结果是:

socket error
socket open Fail
大家可能想“为什么他能返回的结果是:socket open Fail ,在在外层的resure中为什么不能接收到异常呢?为什么不能打印 socket open fail  in opensocket method“

 

今天要讨论的问题就是这个。

在第二段代码与第一段代码的不同就是:return 语句放置 的位置不同。在第二段代码中吧return 放在 ensure中 ,第一段代码则是放置在 begin ... end语言之后。

其实就是这点的原因导致了上面的结果。在代码段2中,我们只是在是希望在异常的善后处理中能把我们想要的值返回去。

这样做将导致一个结果就是,在之前的rescue中raise 的异常将因为这个return而被”吃“掉。  也就是说,这个时候的他就不把raise 这个异常往上抛了,自己处理了,

其实在强类型语言里是不允许在ensure中return的。

例如在C#语言中,在try...catch...finally 的 finally中是不允许有return的,这样就避免了这样的问题发生。


转载于:https://www.cnblogs.com/fly871117/archive/2010/05/17/ruby.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值