Beispiel23: Strukturierte Ausnahmebehandlung (SEH)
Dieser Artikel beschreibt die Verwendung von Structed Exception Handling (SEH) anhand von fünf Varianten.
Download
Hier erhalten Sie den Quellcode für dieses Beispiel.
- 1. Entpacken Sie die heruntergeladene ZIP-Datei.
- 2. Öffnen Sie mittels eines Visual Studios, in dem TwinCAT installiert ist, das Projekt über Open Project ….
- 3. Konfigurieren Sie das Signieren für dieses Projekt, indem Sie auf der Seite unter Rechtsklick auf dem Projekt->Properties->Tc Sign die TwinCAT Signierung anschalten und Ihr Zertifikat und ggf. Passwort konfigurieren.
Weitere Informationen zur Signierung der C++ Projekte erhalten Sie hier. - 4. Wählen Sie Ihr Zielsystem aus.
- 5. Bauen Sie das Beispiel (z. B. Build->Build Solution).
- 6. Aktivieren Sie die Konfiguration mit einem Klick auf
.
- Das Beispiel ist einsatzbereit.
Beschreibung
Das Beispiel beinhaltet fünf Varianten, die die Verwendung von SEH im TwinCAT C++ demonstrieren:
- Exception bei einem NULL-Pointer Zugriff
- Exception bei einem NULL-Pointer Zugriff mit einem Filter
- Exception mit Finally
- Eine kundenspezifische strukturierte Ausnahme (Structured Exception)
- Exception mit Continue Block
Alle diese Varianten sind durch eine Dropdown Box an der Instanz des C++ auswählbar:
Nach Auswahl einer Variante können Sie mit einem Rechts-Klick auf die vorderste Spalte auch zur Laufzeit den Wert schreiben:
Alle Varianten schreiben Trace-Nachrichten zur Verdeutlichung ihres Verhaltens, so dass Meldungen im TwinCAT Engineering erscheinen:
Das Beispiel verstehen
Die Anwahl in der Dropdown Box ist eine Enumeration, die im CycleUpdate() des Moduls zur Auswahl eines Falles (Switch-Case) verwendet wird. Dadurch können hier die Varianten unabhängig voneinander betrachtet werden:
- Exception bei einem NULL-Pointer Zugriff
Hier wird ein PBYTE als NULL angelegt und nachher verwendet, was zu einer Exception führt.
Durch den TcTry{} Block wird diese abgefangen und eine Ausgabe erzeugt. - Exception bei einem NULL-Pointer Zugriff mit einem Filter
Diese Variante greift auf einen NULL-Pointer zu, verwendet aber im TcExcept{} eine Methode FilterException(), die im Modul ebenfalls definiert ist. Innerhalb der Methode wird auf unterschiedliche Exceptions reagiert; in diesem Fall wird lediglich eine Meldung ausgegeben. - Exception mit Finally
Hier erfolgt wieder ein NULL-Pointer Zugriff, wobei auf dieser Stelle jedoch in jedem Fall ein TcFinally{}-Block ausgeführt wird. - Eine kundenspezifische strukturierte Ausnahme (Structured Exception)
Mittels TcRaiseException() wird eine Exception erzeugt, die durch die FilterException() Methode abgefangen und bearbeitet wird. Da es sich hier um eine im Modul definierte Exception handelt, gibt die FilterException() Methode zusätzlich eine weitere (spezifische) Meldung aus. - Exception mit Continue Block
Auch hier erfolgt wieder ein NULL-Pointer Zugriff mit TcExcept{}, diesmal wird die Exception jedoch nach der Behandlung in der FilterException() Methode weiter gereicht, sodass auch der weitere TcExcept{} die Exception behandelt.