2011-11-18 50 views
1

我有一個救援塊,檢查拋出的正確異常或不如下:紅寶石Exception.to_s不匹配,期望字符串

rescue Exception 
     if $!.to_s() != "myException" 
     Err("Unexpected error :" + $!) 
     end 
     else 
     Err("No error") 

$!.to_s()含有大量的字符串如下當我puts喜歡:

if聲明以上 puts
puts $!.to_s() 

輸出是:

myException \n 
th sdfsj dsjhf sdfj \n 
asdj jkds fdf j 

因此,在if聲明中,我想比較$!.to_s()輸出中的第一行與雙引號中的字符串。

任何建議如何解決這個問題?

+3

「正確的異常被拋出」?你不是通過例外編碼,是嗎? – Femaref

+0

感謝Femaref,但在我的情況下,我需要檢查異常消息與異常拋出的情況下預期的異常字符串。 – BSalunke

回答

9

這使我的眼睛受傷。請在ruby中進行面向對象的編程。

class MyException < StandardError; end 

將定義一個新的異常,您可以通過

begin 
    do_something_that_raises_expected_exception 
rescue MyException 
    do_something_else 
end 

拯救所以你不會需要任何字符串比較。

如果你想走下你的路,請使用string.match exception_name,但我建議不要這樣做。

在搶救的另一個詞:儘量不要做rescue Exception,只需使用rescue,因爲Exception抓住的東西像SyntaxError太(這是很可能不希望)。與python相反,ruby中的流量控制不適用例外情況。

+0

謝謝塔斯,但我不想改變其他的東西,唯一的東西是比較從$ !. to_s()的輸出與我在「」引號中提供的字符串的第一行。 – BSalunke

+0

這是帶有'exception_name'的部分。但請提出一個錯誤。 – Reactormonk

3

雖然我Tass完全同意,這裏是你如何能達到你想要的東西:

if $!.to_s !~ /\AmyException\s*\n/ 
    ... 

if $!.to_s.lines.first != "myException \n" 
    ... 

但請:不要做。

+0

它只是我還是看起來像「AmyExceptions」:P – Tim