如何应用try和catch功能?

时间:2016-11-06 13:54:24

标签: erlang

我想知道是否可以在此函数上应用try catch表达式:

add(X,Y)->
         X + Y.

这里用户可以提供字符串而不是整数。

另一个例子:

myfunction(X,Y) ->
    case X == Y of 
         true -> X + Y;
         false -> X * Y
     end.

我只是举了那些例子来知道它是否可能以及如何?

谢谢

1 个答案:

答案 0 :(得分:0)

是的,您当然可以在这些功能中使用try-catch。这就是它的样子:

add(X,Y) ->
  try X + Y of
    Z ->
      Z
  catch
    error:badarith ->
      badargs
end.

如果您担心其他类型的值被传入,更好的解决方案是为函数添加一些防护:

add(X,Y) when is_number(X), is_number(Y) ->
  X + Y.

这确保了如果仅使用数字来评估函数体(X + Y)。如果除了数字之外的其他内容作为这些参数之一传递,则进程将因“无函数子句匹配”错误而崩溃。这是确保类型正确的Erlang方式。虽然Erlang是动态类型的,但您通常应该提前知道您拥有的值是否适合您要执行的操作。也就是说,有时你可能不知道你拥有的变量类型,在这种情况下,在case语句中包含调用会处理不正确的类型:

case {X, Y} ->
  {X, Y} when is_number(X), is_number(Y) ->
    % safe to call add/2
    add(X, Y);
  _ ->
    % values aren't both numbers, so we can't add them
    nocanadd
end

问题myfunction/2中的第二个功能也应该使用警卫。像这样:

myfunction(X,Y) when is_number(X), is_number(Y) ->
  case X == Y of 
     true -> X + Y;
     false -> X * Y
  end.