方法可以處理參數中發生的錯誤嗎?捕捉函數中的參數錯誤?
例如
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它以後會是一個解決方案,但在我的情況變得太麻煩這樣做。
方法可以處理參數中發生的錯誤嗎?捕捉函數中的參數錯誤?
例如
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它以後會是一個解決方案,但在我的情況變得太麻煩這樣做。
與此問題是你在哪裏提供的參數作爲自變量被評估之前到正在調用該方法的線上發生錯誤。
每一個方法調用大約相當於此:
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
將它們映射到可用的東西。
在這種情況下,你的add方法仍然不會被調用,你必須在調用者中救援。
...或者先刪除'nil':'args.compact.inject(:+)'。 –
@CarySwoveland誠然,如果您在末尾添加'.to_i'以捕捉所有'nil'的情況。 – tadman
...或'[nil,nil] .compact.inject(0,:+)#=> 0'。 –