| Operatoren |
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
| Operatoren |