2016-07-28 52 views
3

方法可以處理參數中發生的錯誤嗎?捕捉函數中的參數錯誤?

例如

def add(arg1, arg2) 
    # If the value causes an error, turn it into 0 
    rescue nil 
     0 
    end 
    arg1 + arg2 
end 

add(2, 2+nil) => 2 

據我所知,屏蔽參數和EVAL-ING它以後會是一個解決方案,但在我的情況變得太麻煩這樣做。

回答

3

與此問題是你在哪裏提供的參數作爲自變量被評估之前到正在調用該方法的線上發生錯誤。

每一個方法調用大約相當於此:

arg1 = 2 
arg2 = 2 + nil 

add(arg1, arg2) 

在這種情況下,你可以看到參數本身產生了一個錯誤。延遲參數的評估的唯一方法是通過塊:

add(2) do 
    2 + nil 
end 

改變你的定義:

def add(v) 
    v + yield 

rescue 
    v + 0 
end 

捕捉所有例外一味通常是一個超級壞的計劃,你可能有那裏有一些根本的錯誤。最好避免捕捉異常,除非你對它們會是什麼樣的方式有所期待。

這裏有一個版本的方法與無異常處理:

def add(*args) 
    args.map(&:to_i).inject(:+) 
end 

現在nil.to_i回報0所以你覆蓋:

add(2,2,nil) 

這將計算爲2+2+0內部。

通常這是一個糟糕的計劃,試圖掩埋像2+nil這樣的錯誤。這是一個應該解決的根本性錯誤。如果你想處理nil值,你可以使用.to_i將它們映射到可用的東西。

+0

...或者先刪除'nil':'args.compact.inject(:+)'。 –

+0

@CarySwoveland誠然,如果您在末尾添加'.to_i'以捕捉所有'nil'的情況。 – tadman

+1

...或'[nil,nil] .compact.inject(0,:+)#=> 0'。 –

0

在這種情況下,你的add方法仍然不會被調用,你必須在調用者中救援。