try
— Startet einen Block, in dem Exceptions erkannt und abgefangen werden
können.
try( : : : )
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.
Zusammen bilden die ersten drei Operatoren zwei Codeblöcke:
der erste (try
.. catch
) enthält den zu
überwachenden Code und der zweite (catch
.. endtry
)
den Code, der im Fehlerfall ausgeführt wird.
Der Operator try
leitet den ersten Block ein, der die zu
überwachenden Programmzeilen enthält.
Tritt bei der Ausführung der nachfolgenden Operatoren oder Prozeduren
ein Fehler oder anderer Ausnahmezustand (Exception) auf, oder wird vom
Benutzer mit dem Operator throw
explizit eine Exception geworfen,
wird der try
-Block sofort (bzw. nach Anzeigen eines Fehlerdialogs)
beendet und die Programmausführung beim nächsten catch
-Operator
fortgesetzt.
Tritt die Exception in einer aus dem try
-Block
direkt oder indirekt aufgerufenen Prozedur auf, wird diese Prozedur sofort
(bzw. ebenfalls erst nach Anzeigen eines Fehlerdialogs) verlassen -
einschließlich all der Prozeduren, die auf dem Callstack
oberhalb der Prozedur, die den Fehlerbehandlungscode enthält, liegen.
Ob vor dem Werfen der Exception ein Dialog angezeigt wird oder nicht, steuert die HDevelop-Einstellung 'Fehlermeldungen unterdrücken (HDevelop Exceptions direkt werfen)' im Einstellungsdialog unter 'Bearbeiten->Einstellungen->Allgemeine Optionen->Erfahrener Anwender' . Dieser Fehlerdialog erlaubt es auch, die Programmausführung auf dem Operator, in dem der Fehler aufgetreten ist, d.h. noch vor dem Werfen der Exception anzuhalten, um beispielsweise einen möglicherweise fehlerhaften Operatoraufruf im Programm zu korrigieren.
Der überwachte Programmblock endet mit dem Operator catch
.
Tritt im try
-Block keine Exception auf, wird der nachfolgende
catch
-Block übersprungen und die Ausführung nach dem Operator
endtry
fortgesetzt.
Es ist möglich try
-catch
-endtry
-Blöcke beliebig
ineinander zu schachteln - innerhalb einer Prozedur oder auch über mehrere
Prozeduraufrufe hinweg. Wird dabei in einem inneren
try
-catch
-Block eine Exception abgefangen, ist die
Fehlerbehandlung mit dem Abarbeiten des entsprechenden
catch
-endtry
-Blockes abgeschlossen, und die Exception ist
für die äußeren try
-catch
-Blöcke nicht mehr sichtbar,
es sei denn, die Exception wird aus dem catch
-Block heraus mit dem
throw
-Operator explizit neu geworfen.
Tritt in einem HALCON-Operator ein Fehler auf, werden bestimmte
Informationen über diesen Fehler, wie z.B. Fehlercode und Fehlertext in
einem Exception-Tupel zusammengefasst und an den catch
-Operator
übergeben.
Von dort können sie mit Hilfe des Operators dev_get_exception_data
ausgelesen werden, um sie entsprechend auszuwerten oder auszugeben.
Mehr Informationen zu den gespeicherten Fehlerdaten, den Zugriff darauf und
Besonderheiten beim Export findet man bei diesen beiden Operatoren.
Beim Operator throw
ist beschrieben, was beim Werfen eines
benutzerdefinierten Exception-Tupels zu beachten ist.
Wurde mit dem Operator dev_set_check('~give_error')
oder über den
Dialog 'Bearbeiten->Einstellungen->Laufzeiteinstellungen' ,
Checkbox: 'Fehler zurückgeben' , die Fehlerbehandlung ausgeschaltet,
wird bei einem Operator-Fehler keine Exception geworfen, sondern das Programm
ganz normal mit dem nächsten Operator fortgesetzt.
Im Gegensatz dazu wirft der throw
-Operator immer eine Exception,
unabhängig vom Zustand der 'give_error' -Einstellung.
Das gleiche gilt auch für Fehler, die bei der Auswertung von
Parameterausdrücken auftreten.
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.
try read_image (Image, 'may_be_not_available') catch (Exception) if (Exception[0] == 5200) dev_get_exception_data (Exception, 'error_message', ErrMsg) set_tposition (3600, 24, 12) write_string (3600, ErrMsg) return () else * rethrow the exception throw ([Exception,'unknown exception in myproc']) endif endtry
try
liefert immer 2 (H_MSG_TRUE) zurück.
catch
,
endtry
,
throw
,
dev_get_exception_data
,
dev_set_check
Foundation