2016-07-28 107 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方法仍然不会被调用,你必须在调用者中救援。