2012-03-08 95 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