在函数内捕获参数错误?

时间:2016-07-28 17:22:17

标签: ruby

方法是否可以处理参数中发生的错误?

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

我知道屏蔽参数并在以后对其进行评估可能是一种解决方案,但在我的场景中,这样做变得过于繁琐。

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)

在这种情况下,您的添加方法仍未被调用,您必须在调用者中进行挽救。