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.

Wählen Sie oben rechts eine andere Programmiersprache aus.

trytryTryTrytry (Operator)

Name

trytryTryTrytry — 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()

def try() -> None

Beschreibung

Die Operatoren trytryTryTryTrytry, catchcatchCatchCatchCatchcatch, endtryendtryEndtryEndtryEndtryendtry und throwthrowThrowThrowThrowthrow 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 (trytryTryTryTrytry .. catchcatchCatchCatchCatchcatch) enthält den zu überwachenden Code und der zweite (catchcatchCatchCatchCatchcatch .. endtryendtryEndtryEndtryEndtryendtry) den Code, der im Fehlerfall ausgeführt wird.

Der Operator trytryTryTryTrytry 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 throwthrowThrowThrowThrowthrow explizit eine Exception geworfen, wird der trytryTryTryTrytry-Block sofort (bzw. nach Anzeigen eines Fehlerdialogs) beendet und die Programmausführung beim nächsten catchcatchCatchCatchCatchcatch-Operator fortgesetzt. Tritt die Exception in einer aus dem trytryTryTryTrytry-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 catchcatchCatchCatchCatchcatch. Tritt im trytryTryTryTrytry-Block keine Exception auf, wird der nachfolgende catchcatchCatchCatchCatchcatch-Block übersprungen und die Ausführung nach dem Operator endtryendtryEndtryEndtryEndtryendtry fortgesetzt.

Es ist möglich trytryTryTryTrytry-catchcatchCatchCatchCatchcatch-endtryendtryEndtryEndtryEndtryendtry-Blöcke beliebig ineinander zu schachteln - innerhalb einer Prozedur oder auch über mehrere Prozeduraufrufe hinweg. Wird dabei in einem inneren trytryTryTryTrytry-catchcatchCatchCatchCatchcatch-Block eine Exception abgefangen, ist die Fehlerbehandlung mit dem Abarbeiten des entsprechenden catchcatchCatchCatchCatchcatch-endtryendtryEndtryEndtryEndtryendtry-Blockes abgeschlossen, und die Exception ist für die äußeren trytryTryTryTrytry-catchcatchCatchCatchCatchcatch-Blöcke nicht mehr sichtbar, es sei denn, die Exception wird aus dem catchcatchCatchCatchCatchcatch-Block heraus mit dem throwthrowThrowThrowThrowthrow-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 catchcatchCatchCatchCatchcatch-Operator übergeben. Von dort können sie mit Hilfe des Operators dev_get_exception_datadev_get_exception_dataDevGetExceptionDataDevGetExceptionDataDevGetExceptionDatadev_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 throwthrowThrowThrowThrowthrow 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")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 throwthrowThrowThrowThrowthrow-Operator immer eine Exception, unabhängig vom Zustand der 'give_error'"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 trytryTryTryTrytry, catchcatchCatchCatchCatchcatch, endtryendtryEndtryEndtryEndtryendtry und throwthrowThrowThrowThrowthrow 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

trytryTryTryTrytry liefert immer TRUE zurück.

Alternativen

dev_set_checkdev_set_checkDevSetCheckDevSetCheckDevSetCheckdev_set_check

Siehe auch

catchcatchCatchCatchCatchcatch, endtryendtryEndtryEndtryEndtryendtry, throwthrowThrowThrowThrowthrow, dev_get_exception_datadev_get_exception_dataDevGetExceptionDataDevGetExceptionDataDevGetExceptionDatadev_get_exception_data, dev_set_checkdev_set_checkDevSetCheckDevSetCheckDevSetCheckdev_set_check

Modul

Foundation