Wählen Sie oben rechts eine andere Programmiersprache aus.

Wählen Sie oben rechts eine andere Programmiersprache aus.

Wählen Sie oben rechts eine andere Programmiersprache aus.

trytryTryTry (Operator)

Name

trytryTryTry — Startet einen Block, in dem Exceptions erkannt und abgefangen werden können.

Signatur

try( : : : )

Herror try()

Herror T_try()

void Try()

static void HOperatorSet.Try()

Beschreibung

Die Operatoren trytryTryTryTry, catchcatchCatchCatchCatch, endtryendtryEndtryEndtryEndtry und throwthrowThrowThrowThrow 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 (trytryTryTryTry .. catchcatchCatchCatchCatch) enthält den zu überwachenden Code und der zweite (catchcatchCatchCatchCatch .. endtryendtryEndtryEndtryEndtry) den Code, der im Fehlerfall ausgeführt wird.

Der Operator trytryTryTryTry 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 throwthrowThrowThrowThrow explizit eine Exception geworfen, wird der trytryTryTryTry-Block sofort (bzw. nach Anzeigen eines Fehlerdialogs) beendet und die Programmausführung beim nächsten catchcatchCatchCatchCatch-Operator fortgesetzt. Tritt die Exception in einer aus dem trytryTryTryTry-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)'"Fehlermeldungen unterdrücken (HDevelop Exceptions direkt werfen)""Fehlermeldungen unterdrücken (HDevelop Exceptions direkt werfen)""Fehlermeldungen unterdrücken (HDevelop Exceptions direkt werfen)""Fehlermeldungen unterdrücken (HDevelop Exceptions direkt werfen)" im Einstellungsdialog unter 'Bearbeiten->Einstellungen->Allgemeine Optionen->Erfahrener Anwender'"Bearbeiten->Einstellungen->Allgemeine Optionen->Erfahrener Anwender""Bearbeiten->Einstellungen->Allgemeine Optionen->Erfahrener Anwender""Bearbeiten->Einstellungen->Allgemeine Optionen->Erfahrener Anwender""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 catchcatchCatchCatchCatch. Tritt im trytryTryTryTry-Block keine Exception auf, wird der nachfolgende catchcatchCatchCatchCatch-Block übersprungen und die Ausführung nach dem Operator endtryendtryEndtryEndtryEndtry fortgesetzt.

Es ist möglich trytryTryTryTry-catchcatchCatchCatchCatch-endtryendtryEndtryEndtryEndtry-Blöcke beliebig ineinander zu schachteln - innerhalb einer Prozedur oder auch über mehrere Prozeduraufrufe hinweg. Wird dabei in einem inneren trytryTryTryTry-catchcatchCatchCatchCatch-Block eine Exception abgefangen, ist die Fehlerbehandlung mit dem Abarbeiten des entsprechenden catchcatchCatchCatchCatch-endtryendtryEndtryEndtryEndtry-Blockes abgeschlossen, und die Exception ist für die äußeren trytryTryTryTry-catchcatchCatchCatchCatch-Blöcke nicht mehr sichtbar, es sei denn, die Exception wird aus dem catchcatchCatchCatchCatch-Block heraus mit dem throwthrowThrowThrowThrow-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 catchcatchCatchCatchCatch-Operator übergeben. Von dort können sie mit Hilfe des Operators dev_get_exception_datadev_get_exception_dataDevGetExceptionDataDevGetExceptionDataDevGetExceptionData 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 throwthrowThrowThrowThrow ist beschrieben, was beim Werfen eines benutzerdefinierten Exception-Tupels zu beachten ist.

Wurde mit dem Operator dev_set_check('~give_error')dev_set_check("~give_error")DevSetCheck("~give_error")DevSetCheck("~give_error")DevSetCheck("~give_error") oder über den Dialog 'Bearbeiten->Einstellungen->Laufzeiteinstellungen'"Bearbeiten->Einstellungen->Laufzeiteinstellungen""Bearbeiten->Einstellungen->Laufzeiteinstellungen""Bearbeiten->Einstellungen->Laufzeiteinstellungen""Bearbeiten->Einstellungen->Laufzeiteinstellungen", Checkbox: 'Fehler zurückgeben'"Fehler zurückgeben""Fehler zurückgeben""Fehler zurückgeben""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 throwthrowThrowThrowThrow-Operator immer eine Exception, unabhängig vom Zustand der 'give_error'"give_error""give_error""give_error""give_error"-Einstellung. Das gleiche gilt auch für Fehler, die bei der Auswertung von Parameterausdrücken auftreten.

Achtung

Der Export der Operatoren trytryTryTryTry, catchcatchCatchCatchCatch, endtryendtryEndtryEndtryEndtry und throwthrowThrowThrowThrow 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.

Beispiel (HDevelop)

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

Ergebnis

trytryTryTryTry liefert immer 2 (H_MSG_TRUE) zurück.

Alternativen

dev_set_checkdev_set_checkDevSetCheckDevSetCheckDevSetCheck

Siehe auch

catchcatchCatchCatchCatch, endtryendtryEndtryEndtryEndtry, throwthrowThrowThrowThrow, dev_get_exception_datadev_get_exception_dataDevGetExceptionDataDevGetExceptionDataDevGetExceptionData, dev_set_checkdev_set_checkDevSetCheckDevSetCheckDevSetCheck

Modul

Foundation