English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

ErlangAusnahmen

In jeder Programmiersprache ist das Handling von Laufzeitfehlern erforderlich, um den normalen Fluss der Anwendung aufrechtzuerhalten. Ausnahmen unterbrechen normalerweise den normalen Fluss der Anwendung, daher benötigen wir in der Anwendung das Handling von Ausnahmen.

Normalerweise wird die folgende Nachricht angezeigt, wenn in Erlang ein Ausnahme oder Fehler auftritt.

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

Der Fehlerdump wird in-

erl_crash.dump
init beendet sich in do_boot ()

In Erlang gibt es3Art der Ausnahme-

  • Error−der Aufruf beendet die Ausführung des aktuellen Prozesses und enthält bei der letzten Funktion und ihren Parametern eine Stack-Tracking. Dies sind die Ausnahmen, die die oben genannten laufzeitbedingten Fehler verursachen.erlang:error(Grund)

  • Exit −gibt es zwei Arten von Exit : innerer Ausgang und äußerer Ausgang. Der innere Ausgang erfolgt durch Aufruf der Funktion exit/1ausgelöst und führt dazu, dass der aktuelle Prozess den Ausführungsbefehl stoppt. Der externe Ausgang liegt in exit/2wird aufgerufen und ist mit mehreren Prozessen im Konkurrenzmodul von Erlang verbunden.

  • Wurf −throw ist eine Klasse von Ausnahmen, die für Fälle verwendet werden, die der Programmierer behandeln kann. Im Gegensatz zu Abbruch und Fehler führen sie keinen "Kollapsprozess!" mit sich, sondern steuern den Fluss. Wenn Sie Throw verwenden, um ausgelöst zu werden, ist es in der Regel am besten, ihre Verwendung in den Modulen zu dokumentieren, in denen sie verwendet werden.

try... catch ist eine Methode zur Berechnung von Ausdrücken, die es Ihnen ermöglicht, sowohl erfolgreiche Fälle als auch auftretende Fehler zu behandeln.

try-Die allgemeine Grammatik des catch- Ausdrucks ist wie folgt gezeigt.

Grammatik

Versuchen Sie den Ausdruck von 
ErfolgreichesMuster1 [Wächter] -> 
Expression1; 
ErfolgreichesMuster2 [Wächter] -> 
Expression2 
catch TypeOfError:ExceptionPattern1 -> 
Expression3; 
TypeOfError:ExceptionPattern2 -> 
Expression4 
end

Der Ausdruck zwischen try und of wird als geschützt bezeichnet. Dies bedeutet, dass jede Art von Ausnahme, die während des Aufrufs auftritt, erfasst wird. Die Muster und Ausdrücke zwischen try... und catch sind vollständig gleich dem Verhalten von case....

Schließlich, der catch-Teil - hier können Sie für jeden Typ, den Sie in diesem Kapitel sehen, TypeOfError durch error, throw oder exit ersetzen. Wenn keine Art angegeben ist, wird angenommen, dass sie geworfen wird.

ErrorFehlerart
badarg

Fehlender Datentyp des Parameters oder falsches Format.

badarith

Fehlerhafter Parameter im arithmetischen Ausdruck.

{badmatch,V}

Die Bewertung des Ausdrucks des Ausdrucks schlägt fehl. Der Wert V stimmt nicht überein.

function_clauseBei der Bewertung des Funktionsaufrufs kann keine passende Funktionsklause gefunden werden.
{case_clause,V}

Bei der Berechnung des case-Ausdrucks kann keine passende Branche gefunden werden. Der Wert V stimmt nicht überein.

if_clauseBei der Bewertung des if-Ausdrucks kann keine wahre Branche gefunden werden.
{try_clause,V}

Bei der Berechnung des Abschnitts des try-Ausdrucks kann keine passende Branche gefunden werden. Der Wert V stimmt nicht überein.

undefDie Funktion kann bei der Bewertung des Funktionsaufrufs nicht gefunden werden.
{badfun,F}Der Spaß F hat ein Problem
{badarith,F}

Ein Spaß wird auf die Anzahl der Fehlerparameter angewendet. F beschreibt den Spaß und den Streit.

timeout_valueDer Timeout-Wert im receive..after-Ausdruck wird berechnet als ein Wert außer Integer oder unendlich.
noprocVersuchen Sie, eine nicht vorhandene Prozesse zu verknüpfen.

Nachfolgend ist ein Beispiel dazu, wie man diese Ausnahmen verwendet und wie man sie behandelt.

  • Die erste Funktion generiert alle möglichen Ausnahme-Typen.

  • Dann schreiben wir einen Wrapper-Funktion, um generate_exception im try…catch-Ausdruck aufzurufen.

Online-Beispiel

-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} 
   fangen 
      werfen:X -> {N, gefangen, ausgeworfen, X}; 
      exit:X -> {N, gefangen, ausgetreten, X}; 
      fehler:X -> {N, gefangen, fehler, X} 
   ende. 
      
demo2) -> 
   [{I, (fangen generate_exception(I))} || I <- [1,2,3,4,5]. 
demo3) -> 
   versuchen generate_exception zu erzeugen(5) 
   fangen 
      fehler:X -> 
         {X, erlang:get_stacktrace()} 
   ende. 
   
suche(N) -> 
   case(N) of 
      1 -> {'EXIT', a}; 
      2 -> exit(a) 
   ende.

Wenn wir die HelloWorld:-demo(). des Programms ausführen, erhalten wir die folgende Ausgabe

[{1,normal,a},
{2,gefangen,ausgeworfen,a},
{3,gefangen,ausgetreten,a},
{4,normal,{'EXIT',a}},
{5,gefangen,fehler,a}]