捕捉函数中的参数错误?
问题描述:
方法可以处理参数中发生的错误吗?捕捉函数中的参数错误?
例如
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'。 –