方法是否可以处理参数中发生的错误?
e.g。
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
我知道屏蔽参数并在以后对其进行评估可能是一种解决方案,但在我的场景中,这样做变得过于繁琐。
答案 0 :(得分: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
将它们映射到可用的值。
答案 1 :(得分:0)
在这种情况下,您的添加方法仍未被调用,您必须在调用者中进行挽救。