2010-07-24 73 views
4

我有兩種模式,當保存某些類型的數據時,它會導致數據庫拋出異常。我可以在保存前轉換數據以避免發生異常,但轉換過程非常昂貴,並且異常情況很少發生。捕捉model.save或model.save中的數據庫異常!方法?

所以,我想知道是否有可能創建model.save方法的重載,並捕獲從數據庫中拋出的異常?這會起作用嗎?

例如:

def save 
    begin 
    super 
    rescue Exception => e 
    if e.is_a? ActiveRecord::StatementInvalid 
     # Do some processing and resave 
    end 
    end 
end 

爲什麼我想要做的,這是因爲我已經不得不重複的兩款車型都有這個問題之間處理代碼很大一部分的原因,也因爲我想避免後來在其他地方調用保存的潛在問題,但不會添加異常處理代碼。

例如,當編寫一些測試代碼並直接調用保存時,錯誤數據會引發異常。

所以,有幾個問題:

  1. 它甚至有可能從內部保存或保存捕捉異常!方法?
  2. 修復數據後,如何嘗試再次保存?我是否再次調用super()?
  3. 有沒有更好的處理方法?

非常感謝。

回答

3

我不會重寫保存的默認行爲,我會簡單地創建我自己的方法。

def save_with_exception_handler 
    begin 
    self.save! 
    rescue Exception => e 
    if e.is_a? ActiveRecord::StatementInvalid 
     # Do some processing and resave 
    end 
    end 
end 

給它一個更好的名字,顯然在你的上下文中是有意義的。然後只需打電話給你目前打電話保存:

model_instance.save_with_exception_handler 
+2

感謝您的想法,這肯定會工作。事情是,這樣做,我必須依靠我的記憶,通過保存或保存調用該方法!在我的測試中,默認情況下,我使用save(),導致拋出異常並重新訪問此問題,所以如果可能的話,我寧願重寫保存。 有趣的是,我試着重寫save()並強制在測試中拋出異常,並且沒有發現異常。任何想法爲什麼這可能是,考慮到我使用相同的測試數據,通常會導致異常被拋出?再次感謝。 – michaeldwp 2010-07-24 22:06:55

+0

我有一個與銷燬類似的問題...如果你在捕獲(搶救)基類從一個重載函數引發的異常方面有任何進展,請將它發佈在這裏:) – 2013-06-20 04:46:42

+0

在救援時要小心額外的「例外」線。操作時務必小心,您必須確定接下來的內容。就像這裏解釋的: http://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby – lboix 2014-06-05 02:57:47