2016-11-06 5 views
-1

私はそれが可能この機能にトライキャッチ式を適用するかどうかを知りたい:機能を試してキャッチする方法は?

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

ユーザーではなく、整数の文字列を提供することができます。

もう一つの例:

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

私はちょうどそれが可能だか、何とどのようにかどうかを知りませんし、それらの例を与えましたか?

ありがとうございました

+0

' X + Yのキャッチを試みる_同様:このように_ - > "何かが間違っていた..." end.'? – Dogbert

+0

はい、可能です。スタックオーバーフローに関する[関連するディスカッション](http://stackoverflow.com/questions/4412640/how-to-get-try-catch-to-work-in-erlang)を参照してください。 –

+0

2番目の例はどうですか? 最初の関数に複数の式があるとどうなりますか? > レム= NのREM 2、 RES = Nのdiv 2、 .... それができる - MyFunctionを(N):私はこのように私の機能で倍数式を持っている程度ならば、何に答えるために – erlang

答えて

0

はい、これらの機能では確かに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. 
+0

ありがとうございました取り扱った? – erlang

+1

@erlang私は関数にガードを追加し、関数内ですべてが期待通りに進むと仮定します。呼び出し元コードが不正な入力であっても機能することが重要な場合は、try catchブロックまたはcase文の関数に呼び出しをラップします。 – Stratus3D

関連する問題