2011-06-03 67 views
0

我正在構建一個api包裝庫。有一組方法都是簡單的「getters」,它們進入了一定的散列並抽出了字符串。如何以一組方法完全相同的方式處理異常?

對於所有這些,可能會有一個nil哈希或一些其他數據問題(不是網絡問題,我正在處理其他地方)。如果遇到這樣的問題,我想提出一個DataError異常,然後在用戶界面中處理這些異常。所以我有一個handle_data_error方法,它接受一個塊,如果塊發生錯誤,我抓住它並且提出DataError

有沒有什麼辦法可以在這個方法中優雅地包裝一組方法的全部內容,而不必在那裏輸入15次呢?任何告訴班級的方式「以這種方式處理這類錯誤」?它發生在我身上,也許我應該看看Rails的rescue_from的實現。

+0

你是什麼意思的零散列?零不是一個散列。你的意思是**空**散列? – sawa 2011-06-03 22:18:07

+0

東西,可以是哈希,或零:) – 2011-06-03 23:17:32

回答

0

rescue_from只能在控制器。

當你有很多的類似的方法,你可以重構他們要麼打電話,你處理錯誤的一個共同的核心方法:

class Foo 
    def m1 
    m 1 
    end 

    def m2 
    m 2 
    end 

    def m(arg) 
    begin 
     # try 
    rescue 
     # handle error 
    end 
    end 
end 

或使用method_missing來處理所有這些方法調用,並處理錯誤有:

class Foo 
    def method_missing(method, *args, block) 
    (super and return) unless method =~ /whatever/ 
    begin 
     #try 
    rescue 
     # handle error 
    end 
    end 
end 
+0

「rescue_from只適用於控制器」 - 是的,但我認爲它的元編程實現了我想要我的課程的魔術全部行爲,所以它的實現是值得的探索:) – 2011-06-03 23:26:17

1

如果你想以中心方式處理錯誤,也許你的方法不應該拋出一個錯誤,而是捕捉錯誤並將它們傳送到到

  • 中央聽衆它接受錯誤,並調度它們,或
  • 一個處理這確實基於錯誤的東西...
1

如果你想返回DataErrorhash缺乏key,你可以這樣做:

hash.fetch(key, DataError.new) 
+0

不知道,方便 – 2011-06-03 23:19:44

相關問題