catch
— Fängt im vorangehenden try
-Block geworfene Exceptions.
catch( : : : Exception)
Die Operatoren try
, catch
, endtry
und throw
erlauben es, in HDevelop-Programme Code für eine dynamische
Fehlerbehandlung ähnlich zu den Programmiersprachen C++ oder C# einzubauen.
Grundlegende Informationen zur Fehlerbehandlung in HDevelop finden sich bei
den Operatoren try
, throw
und dev_set_check
sowie
im „HDevelop User's Guide“.
Der Operator catch
trennt den zu überwachenden Programmbereich von
dem Code, der im Fehlerfall auszuführen ist. Tritt im vorhergehenden
try
-catch
-Block kein Fehler auf, wird der gesamte
catch
-endtry
-Block übersprungen.
Im Fehlerfall dagegen wird von dem Operator, in dem der Fehler aufgetreten
ist, (bzw. vom throw
-Operator) direkt zum catch
des
umschließenden try
-catch
-Blocks gesprungen.
Im Ausgabeparameter Exception
wird dem catch
-Operator ein
Tupel mit den Fehlerdaten bzw. bei throw
ein vom Benutzer
weitestgehend frei definierbares Tupel übergeben.
Das wichtigste Fehlerdatum ist der Fehlercode. Daher wird dieser im
Exception
-Tupel immer an erster Stelle zurückgeliefert
und kann direkt mit 'Exception' [0] abgefragt werden.
Alle anderen Daten müssen über den Operator
dev_get_exception_data
abgefragt werden, da sich die Reihenfolge
und der Umfang der bereitgestellten Informationen unter Umständen in
zukünftigen Versionen ändern und sich beim exportierten Code von Sprache
zu Sprache unterscheiden kann.
Insbesondere ist zu beachten, dass im exportierten Code nicht alle
Informationen verfügbar sind, sowie dass es Informationen gibt, die
möglicherweise erst bei einem expliziten Zugriff darauf bereitgestellt werden
(wie z.B. Fehlertexte).
Beim Fehlercode handelt es sich bei Operatoraufrufen immer um einen
HALCON-Fehlercode (< 10000) bzw. beim Aufruf von Operatoren
aus einem Extension Package um einen anwenderdefinierten Fehlercode
(> 10000).
Die HALCON-Fehlercodes werden im Anhang des „Extension Package
Programmer's Manual“ aufgelistet.
Wird mit throw
ein benutzerdefiniertes Exception
-Tupel
geworfen, sollte dieses als erstes Element immer einen
Fehlercode >= 30000 als Kennzeichnung enthalten.
Alle weiteren Elemente können vollkommen frei gesetzt werden.
Tritt in HDevelop oder der HDevEngine ein Operatorfehler auf, werden im
Exception
-Tupel die
folgenden Informationen über den Fehler und den Ort seines Auftretens zur
Verfügung gestellt:
der HALCON-Fehlercode,
ein zusätzlicher HDevelop-spezifischer Fehlercode, der
darüber informiert, ob der Fehler innerhalb des HALCON-Operators
generiert wurde (Fehlercode = 21000), oder ob er bereits bei der
Übergabe der Parameter, d.h. bei der Auswertung der Parameterausdrücke
aufgetreten ist.
Im zweiten Fall wird mit diesem Fehlercode die Art des Fehlers genauer
spezifiziert.
Die relevanten HDevelop-Fehlercodes werden beim Operator
dev_get_exception_data
aufgelistet.
der HALCON-Fehlertext,
ein passender HDevelop-spezifischer Fehlertext,
die Zeilennummer, in der der Fehler aufgetreten ist,
der Name des Operators (tritt der Fehler in einer geschützten Prozedur auf, wird '--protected--' zurückgeliefert),
die Aufruftiefe ('main' hat die Tiefe 1),
der Name der Prozedur.
Für eine automatische Fehlerbehandlung ist vor allem der HALCON-Fehlercode von Bedeutung. Die weiteren Daten haben in erster Linie informativen Charakter. Achtung: Im exportierten Code stehen die Informationen über den Fehlerort nicht oder nur eingeschränkt zur Verfügung.
Der Export der Operatoren try
, catch
, endtry
und throw
ist nur in die Sprachen C++, C# und VisualBasic/.NET
möglich, da nur sie das Werfen und Fangen von Exceptions über
Prozedurgrenzen hinweg unterstützen.
Beim Export nach C können diese Operatoren nicht
unterstützt werden.
Exception
(output_control) exception-array →
(integer / string)
Tupel mit den Fehlerdaten.
catch
liefert immer 2 (H_MSG_TRUE) zurück.
try
,
endtry
,
throw
,
dev_get_exception_data
,
dev_set_check
Foundation