我想知道是否可以在此函数上应用try catch表达式:
add(X,Y)->
X + Y.
这里用户可以提供字符串而不是整数。
另一个例子:
myfunction(X,Y) ->
case X == Y of
true -> X + Y;
false -> X * Y
end.
我只是举了那些例子来知道它是否可能以及如何?
谢谢
答案 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.