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 TRUE zurück.
catch,
endtry,
throw,
dev_get_exception_data,
dev_set_check
Foundation