2014-05-22 40 views
4

我上的概念真的很困惑:在Ruby中引發異常返回false-何時以及爲什麼?

  • 不要使用異常控制流
  • 不要返回零/ false作爲例外

說我有以下實例方法:

class Logo 
    # This method has some logic to create an image using Rmagick 
    def process 
    begin 
     @logo_image = RmagickHelper.new(self.src) 
    rescue Magick::ImageMagickError 
     raise Exceptions::LogoUnprocessable, "ImageMagick can't process the URL" 
    end 
    end 
end 

因此,在更一般的方法,我有以下幾點:

def build_all_images 
    begin 
     @logo.process 
    rescue Exceptions::LogoUnprocessable 
     @logo.status = 'unprocessable' 
     return false #This terminates the method so no more stuff is processed, because logo could not be processed. 
    end 
#.... 
end 

我的問題是:

這是正確的事情:

raise Exceptions::LogoUnprocessable, "ImageMagick can't process the URL" 

還是應該我剛纔做

return false 
+0

我強烈推薦http://exceptionalruby.com/ – DGM

回答

7

曾幾何時有語言,無例外構建體()。每條消息都返回一個整數 - 0表示成功或者一些錯誤代碼表示失敗。如果調用者在繼續之前沒有檢查返回碼 - 他會被擰緊。另外,大多數時候呼叫者對失敗沒有任何可以做的事情,所以即使當他檢查結果時 - 他所能做的唯一的智能事情就是返回它自己的錯誤代碼...

然後來了,帶有異常構造,僅用於這些用例。當方法進入無法處理的狀態時(例如,閱讀不存在的文件,或者沒有互聯網連接的情況下上網),則會例外。

濫用異常構建體是指一個異常在一個完全預期情況提出,例如:

def even? 
    if (self % 2 != 0) 
    raise NumberNotEvenException 
    end 
end 

這裏的數爲奇數是合法的,並且預期;拋出一個錯誤是濫用異常構造。

當方法無法完成它承諾做的事情時拋出異常。

在另一面 - 返回nilfalse當一個方法失敗使我們又回到了快樂天,它是調用者的負擔注意到失敗,並計算出了什麼毛病 - 不好玩。

+0

因此,就我而言,我會引發異常,因爲該圖像的SRC無法訪問(因爲網頁已關閉或因爲它無法打開爲圖片)。這將是一個很好的例子,是嗎? –

+1

是的,在這種情況下,似乎有一個例外。 –

+0

也許不是直接相關的,但Rails中的'save'返回'false',但是'save!'會拋出一個錯誤,所以這可能是在Rails編碼時遇到的問題。 – Iceman

3

不同之處在於失敗發生的頻率以及是否是簡單的返回值。

問「這是一個有效的網址」會期望一個「假」值,但在這種情況下,似乎預計有效的網址時,失敗的情況下會出現異常。

異常是「特殊」或不尋常的。命令方法中會出現異常情況,您可以告訴它「執行此操作」並說「哎呀!」

流量控制更多的是「這是什麼」的問題,在這種情況下「oops」沒有意義。

此外,請考慮代碼被調用的次數 - 異常處理的時間比簡單的返回值要多得多。

相關問題