Erlang 如何在函数上应用try-and-catch?

Erlang 如何在函数上应用try-and-catch?,erlang,try-catch,Erlang,Try Catch,我想知道是否可以在此函数上应用try-catch表达式: 添加(X,Y)-> X+Y。 在这里,用户可以提供字符串而不是整数 另一个例子: myfunction(X, Y) -> case X == Y of true -> X + Y; false -> X * Y end. 我只是给出了这些示例,以了解它是否可能以及如何实现?是的,您当然可以在这些函数中使用try-catch。下面是它的样子: add(X,Y)

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

添加(X,Y)->
X+Y。
在这里,用户可以提供字符串而不是整数

另一个例子:

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

我只是给出了这些示例,以了解它是否可能以及如何实现?

是的,您当然可以在这些函数中使用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.

比如
尝试X+Y捕捉错误结束。
尝试X+Y捕捉错误:“\u->”结束。
?是的,这是可能的。请参阅关于堆栈溢出的。第二个示例如何?如果我在第一个函数中有多个表达式呢?谢谢你的回答,如果我的函数中有多个表达式,比如:myfunction(N)->Rem=nrem2,Res=ndiv2,…,会怎么样。。。。可以处理吗?@erlang我会在函数中添加一个保护,然后假设函数中的一切都按照预期进行。如果调用代码即使在输入错误的情况下也能工作很关键,那么将对函数的调用封装在try-catch块或case语句中。