2012-03-08 57 views
2

对不起,我不确定如何分类这个问题。我正在更新一些ruby代码到1.9.3,并且看到一些奇怪的行为。蒸出的问题,我得到:ruby​​版本之间隐含的异常类别差异

def convert(exception) 
    raise exception.message 
end 

begin 
    convert(StandardError.new(StandardError)) 
rescue => e 
    puts e.class 
end 

在1.9.2中,输出

StandardError 

和1.9.3,TE输出

RuntimeError 

展望虽然红宝石文档并且发布笔记并没有给我任何线索,因为这里可能会发生什么,并且任何帮助都会被赞赏!

回答

2

这个问题似乎是之前1.9.3,Exception#message返回Class类的一个对象,String,这会导致奇怪的事情发生,并最终引发异常与意外的类(即不RuntimeError)。

此错误已固定在this commit,它是存在于1.9.3 changelog

最后,你想raise exception,不raise exception.message

+0

好的,这是有道理的。我需要更好地阅读c代码。为了清楚起见,并不是说消息本身返回了一个类,它只是返回了传入的任何对象,而应该将其转换为字符串。谢谢您的帮助! – Chris 2012-03-08 21:06:53

+0

它应该返回一个'String',是的,但是它实际返回的结果有点难以辨认。在它上面调用'.class'会产生'Class',但是可能会有更多奇怪的事情发生。它很难遵循,因为它在C(和C Ruby是巨大的)。 – 2012-03-08 21:09:17