はい、これらの機能では確かにtry-catchを使用できます。ここではどのようなそれは次のようになります。これは、ことを確認し
add(X,Y) when is_number(X), is_number(Y) ->
X + Y.
:渡されている他のタイプの値についてのご心配、より良い解決策ではなく、機能にいくつかの警備員を追加することです場合
add(X,Y) ->
try X + Y of
Z ->
Z
catch
error:badarith ->
badargs
end.
関数本体(X + Y
)が数値でのみ評価される場合。これらの引数のいずれかに数値以外のものが渡された場合、プロセスは「関数節が一致していません」というエラーでクラッシュします。これは、型が正しいことを保証するErlangの方法です。 Erlangは動的に型指定されますが、実行する操作に適した値があれば、事前に知っておくべきです。
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
本当に使用する必要があります:それがあると述べ回あなたが持っている変数の場合、およびcase文で呼び出しをラップするような場合に種類を知らないかもしれないが間違ったタイプを処理しますガードも。 >エラーend.`または `X + Yキャッチエラーを試してみてください - _::
myfunction(X,Y) when is_number(X), is_number(Y) ->
case X == Y of
true -> X + Y;
false -> X * Y
end.
' X + Yのキャッチを試みる_同様:このように_ - > "何かが間違っていた..." end.'? – Dogbert
はい、可能です。スタックオーバーフローに関する[関連するディスカッション](http://stackoverflow.com/questions/4412640/how-to-get-try-catch-to-work-in-erlang)を参照してください。 –
2番目の例はどうですか? 最初の関数に複数の式があるとどうなりますか? > レム= NのREM 2、 RES = Nのdiv 2、 .... それができる - MyFunctionを(N):私はこのように私の機能で倍数式を持っている程度ならば、何に答えるために – erlang