Erlang-例外

アプリケーションの通常のフローを維持できるように、ランタイムエラーを処理するには、プログラミング言語で例外処理が必要です。例外は通常、アプリケーションの通常のフローを中断します。これが、アプリケーションで例外処理を使用する必要がある理由です。

通常、Erlangで例外やエラーが発生すると、以下のメッセージが表示されます。

{"init terminating in do_boot", {undef,[{helloworld,start,[],[]}, 
{init,start_it,1,[]},{init,start_em,1,[]}]}}

クラッシュダンプは次のように書き込まれます-

erl_crash.dump
init terminating in do_boot ()

アーランには3種類の例外があります-

  • Error −呼び出し erlang:error(Reason)現在のプロセスで実行を終了し、最後に呼び出された関数のスタックトレースを、キャッチしたときに引数とともに含めます。これらは、上記のランタイムエラーを引き起こす種類の例外です。

  • Exists−出口には、「内部」出口と「外部」出口の2種類があります。内部出口は、関数を呼び出すことによってトリガーされますexit/1現在のプロセスに実行を停止させます。外部出口はで呼び出されますexit/2 そして、Erlangの並行側面における複数のプロセスと関係があります。

  • Throw−スローは、プログラマーが処理することが期待できる場合に使用される例外のクラスです。出口やエラーと比較して、それらは実際には「そのプロセスのクラッシュ」を実行しません。それらの背後にある意図ではなく、むしろそれらは流れを制御します。プログラマーがスローを処理することを期待しながらスローを使用する場合、通常、スローを使用するモジュール内での使用を文書化することをお勧めします。

A try ... catch は、成功したケースと発生したエラーを処理できるようにしながら、式を評価する方法です。

trycatch式の一般的な構文は次のとおりです。

構文

try Expression of 
SuccessfulPattern1 [Guards] -> 
Expression1; 
SuccessfulPattern2 [Guards] -> 
Expression2 

catch 
TypeOfError:ExceptionPattern1 -> 
Expression3; 
TypeOfError:ExceptionPattern2 -> 
Expression4 
end

その間の表現 try and of保護されていると言われています。これは、その呼び出し内で発生するあらゆる種類の例外がキャッチされることを意味します。間のパターンと表現try ... of and catch とまったく同じように動作します case ... of

最後に、キャッチパーツ–ここで交換できます TypeOfErrorこの章で見たそれぞれのタイプごとに、エラー、スロー、または終了のいずれかによって。タイプが指定されていない場合、スローが想定されます。

以下は、Erlangのエラーとエラーの理由の一部です。

エラー エラーの種類
badarg 悪い議論。引数のデータ型が間違っているか、形式が正しくありません。
バダリス 算術式の引数が正しくありません。
{badmatch、V} 一致式の評価に失敗しました。値Vが一致しませんでした。
function_clause 関数呼び出しを評価するときに、一致する関数句が見つかりません。
{case_clause、V} ケース式を評価するときに、一致するブランチが見つかりません。値Vが一致しませんでした。
if_clause if式を評価するときに真の分岐が見つかりません。
{try_clause、V} try式のof-sectionを評価するときに、一致するブランチが見つかりません。値Vが一致しませんでした。
undef 関数呼び出しを評価するときに関数が見つかりません。
{badfun、F} 楽しいFで何かがおかしい
{badarity、F} 間違った数の引数に楽しみが適用されます。Fは楽しさと議論を説明します。
timeout_value receive..after式のタイムアウト値は、整数または無限大以外の値に評価されます。
noproc 存在しないプロセスにリンクしようとしています。

以下は、これらの例外を使用する方法と実行方法の例です。

  • 最初の関数は、考えられるすべてのタイプの例外を生成します。

  • 次に、呼び出すラッパー関数を記述します generate_exception try ... catch式で。

-module(helloworld). 
-compile(export_all). 

generate_exception(1) -> a; 
generate_exception(2) -> throw(a); 
generate_exception(3) -> exit(a); 
generate_exception(4) -> {'EXIT', a}; 
generate_exception(5) -> erlang:error(a). 

demo1() -> 
   [catcher(I) || I <- [1,2,3,4,5]]. 
catcher(N) -> 
   try generate_exception(N) of 
      Val -> {N, normal, Val} 
   catch 
      throw:X -> {N, caught, thrown, X}; 
      exit:X -> {N, caught, exited, X}; 
      error:X -> {N, caught, error, X} 
   end. 
      
demo2() -> 
   [{I, (catch generate_exception(I))} || I <- [1,2,3,4,5]]. 
demo3() -> 
   try generate_exception(5) 
   catch 
      error:X -> 
         {X, erlang:get_stacktrace()} 
   end. 
   
lookup(N) -> 
   case(N) of 
      1 -> {'EXIT', a}; 
      2 -> exit(a) 
   end.

プログラムをhelloworld:demo()として実行するとします。、次の出力が得られます-

出力

[{1,normal,a},
{2,caught,thrown,a},
{3,caught,exited,a},
{4,normal,{'EXIT',a}},
{5,caught,error,a}]