2011-03-24 67 views
0

讓我們說,我在Rails的這個功能(其實我也:P - EVAL被使用,因爲會出現第三,第四或更多class_number在未來):在Rails中處理奇怪異常的最佳做法是什麼?

def all_profession_costs(class_number) 
     second = {'Wealth Ranger' => 1000, 'Wisdom Vacuum' => 1000, 'Life Leecher' => 1000, 'Dense Mass' => 1000} 
     costs = eval(class_number) 
     costs 
    end 

這似乎是工作的罰款現在,但如果我不小心使用'firsta'作爲我的class_number,整個事情可能會崩潰,也許會出現一個難以發現的錯誤。

所以,現在我在想兩件事。我絕對想盡可能檢查一些事情,但我不喜歡把「引發RuntimeError」,因爲它使代碼更醜陋。並使其運行速度變慢。那麼,我認爲後者是可以忍受的,因爲檢查意味着更好的代碼。

但是,我不喜歡醜陋。我正在考慮創建一個單獨的ExceptionHandling模塊,以便進行這種驗證。

在這個例子中,我想檢查class_number是'first','second'還是'third'。

,而不是像這樣:

raise RuntimeError unless ['first', 'second', 'third'].include?(class_number.to_s) 

也許我可以寫一個簡單的模塊(可能就像是一個Python的裝飾),這將使這件事情更好的閱讀,我認爲是更漂亮的代碼,東西如:

validates class_number, :inclusion => ['first', 'second', 'third'] 

有點像標準模型驗證器。

您對此有何看法?這是一個好主意嗎?你會如何對待Rails中的一些錯誤處理?

+0

class_number是做什麼的? – edmz 2011-03-24 06:48:54

+0

它只是一個函數參數,用於拾取第一個,第二個或第三個散列(在本例中,只有第二個散列存在於函數中,但會添加更多散列)。根本不用擔心。 – Spyros 2011-03-24 06:52:18

回答

0

驗證 - 在你給出的例子中,你沒有引發異常。如果class_number不是「first」,「second」,「third」之一,你可以簡單地返回false。並檢查方法被調用的響應。這種方法是驗證方法。

異常 - 當可能導致錯誤的原因不是由於錯誤的用戶輸入,而是因爲在您的邏輯,實施或您無法控制的因素中出現嚴重錯誤時引發異常。

儘管這些並不是硬性規定,他們更多的是我通常遵循的指導方針。

在上面的例子中,它取決於class_number來自何處。它來自用戶輸入嗎?我會做一個驗證。如果它不應該來自用戶輸入,我會引發異常。此外,您不必簡單地提出RuntimeError。你可以設計你自己的異常類。在你的情況,有點像,

class InvalidClassNumber < RuntimeError 
end 

,做 除非[ '第一', '第二', '第三'。包括什麼呢?(class_number.to_s) 提高InvalidClassNumber,「類號可以爲'我們得到了#{class_number.to_s}「 end

如果你調用這個方法,你可以將它解救出來,做任何你需要做的事情來處理它。

begin 
    @profession = @user.profession(class_number) 
rescue InvalidClassNumber => e 
    # Do whatever you need to 
    logger.debug e.message 
    # redirect somewhere, or whatever 
end 

自定義異常類讓您靈活精確地處理那些你期待的,而不是處理一般異常喜歡RuntimeError,例外。您可以在應用程序中擁有儘可能多的異常類。你甚至可以使用::給他們一個名字空間。 Profession::InvalidClassNumber < RuntimeError

+0

你好Chirantan和thanx的回覆非常豐富。我仍然認爲開始救援的結局處理相當醜陋,不能說出真相。你如何評價我在問題中描述它的方式? (請記住,在這種情況下,class_name來自我,程序員)。也許我可以儘可能爲用戶輸入和程序員輸入進行驗證。你認爲這是一個好主意嗎? – Spyros 2011-03-24 09:40:14

+0

異常處理對我來說依然很乾淨,並且可能是通過程序傳遞錯誤消息的最明智的方式。如果我們走你的路線,那麼如何將驗證信息傳遞迴被調用的地方呢?您可能必須遵循活動記錄驗證模型。我仍然會建議這種情況的例外情況。我通常儘量避免它們,但是你的看起來像是一個典型的異常處理案例。 – Chirantan 2011-03-24 12:28:13

+0

我實際上正在考慮使用上面提到的「validates」思想,並使用異常實現。因此,'驗證:包含的class_number',如果不包含,實際上會引發異常。這樣,所有的背景資料,如消息和進一步處理都會發生在模塊內部。 – Spyros 2011-03-24 17:29:26

相關問題