2013-07-06 52 views
1

如何爲異常實現默認行爲? begin rescue else不起作用(我認爲應該)。在ruby中處理默認異常

而且,在場景中是不是else毫無意義?在沒有異常發生時必須運行的任何代碼都會在begin-rescue塊之間運行。

順便說一句,我有以下解決方法,但我不滿意它。所有的

class MyException < Exception 
end 

class YourException < Exception 
end 

begin 
    raise MyException if 2 > 50 
    raise YourException if 1 < 90 
rescue Exception => e 
    case e.message 
    when /MyException/ 
    puts "MyException Caught" 
    else 
    puts "Default Exception Caught" 
    end 
end 
+0

應該做到以下幾點:搶救MyException,然後救援異常(不知道爲什麼我沒有這樣做過。:() – oozzal

回答

5

首先,你真的應該不繼承Exception。它是所有超級紅寶石的例外,包括NoMemoryError,SyntaxError,Interrupt,SystemExit;所有這些你通常不需要從中解救出來。這樣做,無論是意外還是故意,都是不鼓勵的,因爲它可以防止程序正常退出,即使它被用戶中斷。它也可以隱藏或產生一些相當晦澀的錯誤。

你想要的子類是StandardError,它是我們在日常編程中看到的大多數Ruby錯誤的超類。這個類也是一個這將是rescue d,你應該不指定一個:

begin 
    object.do_something! 
rescue => error # will rescue StandardError and all subclasses 
    $stderr.puts error.message 
end 

我相信這是「默認行爲」,你正在尋找。您可以處理一個特定的錯誤,那麼所有其他錯誤一般:

class CustomApplicationError < StandardError 
end 

begin 
    object.do_something! 
rescue CustomApplicationError => error 
    recover_from error 
rescue => error 
    log.error error.message 
    raise 
end 

else條款是不是在錯誤處理毫無意義。它會執行嵌套代碼,當且僅當沒有異常被提出時,與ensure子句不同,它將執行代碼。它允許你處理成功的情況。

begin 
    object.do_something! 
rescue => error 
    log.error error.message 
else 
    log.info 'Everything went smoothly' 
end 
+0

else子句對我來說沒有多大意義,因爲我被卡住瞭如何處理默認的異常情況,只要我得到它,其他的是有意義的。謝謝你的迴應。:) – oozzal

+0

想通了。你的第二塊代碼是有意義的。不是爲了營救「例外」,而是爲其他例外使用救援。謝謝:) – oozzal

1

首先,我不明白你爲什麼用錯誤信息進行病例調整。爲什麼不通過他們的班級與錯誤呢?然後,它會是這樣的:

begin 
    raise MyException if 2 > 50 
    raise YourException if 1 < 90 
rescue Exception => e 
    case e 
    when MyException 
    puts "MyException Caught" 
    else 
    puts "Default Exception Caught" 
    end 
end 

第二,如上所述並不是直接的方法。做正確的方法是:

begin 
    raise MyException if 2 > 50 
    raise YourException if 1 < 90 
rescue MyException 
    puts "MyException Caught" 
rescue Exception 
    puts "Default Exception Caught" 
end 

如果YourException是的StandardError一個子類,那麼它可以被rescue沒有指定異常類抓獲。

+0

是的,這是正確的答案,我後來發現它(如評論中所述)。不過謝謝。 :) – oozzal