Erlang 如何在函数上应用try-and-catch?
我想知道是否可以在此函数上应用try-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)
添加(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语句中。