Ansicht
Dokumentation

ABAPCATCH_TRY - CATCH TRY

ABAPCATCH_TRY - CATCH TRY

PERFORM Short Reference   Fill RESBD Structure from EBP Component Structure  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

CATCH

Kurzreferenz



CATCH $[BEFORE UNWIND$] cx_class1 cx_class2 ... $[INTO oref$].

Zusätze:

1. ... BEFORE UNWIND

2. ... INTO oref

Wirkung

Einleitung eines CATCH-Blocks einer TRY-Kontrollstruktur, in dem Ausnahmen behandelt werden können.

Ein CATCH-Block ist ein Ausnahmebehandler, also die Programmlogik, die ausgeführt wird, wenn die zugehörige Ausnahme im TRY-Block der gleichen TRY-Kontrollstruktur auftritt.

Ein CATCH-Block behandelt die Ausnahmen der Ausnahmeklassen cx_class1 cx_class2 ..., die hinter der Anweisung CATCH angegeben sind, sowie die Ausnahmen der Unterklassen dieser Ausnahmeklassen. In jeder Anweisung CATCH einer TRY-Kontrollstruktur kann eine Liste beliebig vieler Ausnahmeklassen cx_class1 cx_class2 ... aufgeführt werden, wobei speziellere Ausnahmeklassen (Unterklassen) vor allgemeineren Ausnahmeklassen (Oberklassen) aufgeführt werden müssen. Diese Reihenfolge muss sowohl innerhalb einer CATCH-Anweisung als auch über mehrere CATCH-Anweisungen einer TRY-Kontrollstruktur hinweg eingehalten werden.

Standardmäßig wird der Kontext, in dem die Ausnahme ausgelöst wurde, vor der Ausführung des CATCH-Blocks gelöscht. Um den Kontext während der Ausführung des CATCH-Blocks zu erhalten, kann der Zusatz BEFORE UNWIND verwendet werden.

Hinweis

Die Vorschrift, dass bei CATCH spezielle vor allgemeinen Ausnahmeklassen aufgeführt werden müssen, stellt sicher, dass eine Ausnahme nicht von einem allgemeinen Ausnahmebehandler (Oberklasse) behandelt wird, wenn ein spezieller Behandler (Unterklasse) vorgesehen ist.

Beispiel

Abfangen zweier möglicher Ausnahmen mit CATCH. Wenn die Eingabe nicht als Zahl interpretierbar ist, wird die Ausnahme CX_SY_CONVERSION_NO_NUMBER über ihre Oberklasse CX_SY_CONVERSION_ERROR abgefangen. Wenn die Zahl 0 eingegeben wird, wird die Ausnahme CX_SY_CONVERSION_ERROR über ihre Oberklasse CX_SY_ARITHMETIC_ERROR abgefangen.

Ausnahmen, CATCH

Zusatz 1

... BEFORE UNWIND

Wirkung

Wenn der Zusatz BEFORE UNWIND angegeben ist, wird der Kontext, in dem die Ausnahme ausgelöst wurde, nicht vor der Ausführung des CATCH-Blocks gelöscht. Statt dessen bleibt der Kontext inklusive aller aufgerufenen Prozeduren und deren lokalen Daten während der Ausführung des CATCH-Blocks erhalten.

  • Wenn im CATCH-Block keine RESUME-Anweisung ausgeführt wird, wird der Kontext beim Verlassen des CATCH-Blocks gelöscht.
  • Wenn im CATCH-Block eine RESUME-Anweisung ausgeführt wird, wird die Verarbeitung hinter der Stelle, welche die Ausnahme ausgelöst hat, wieder aufgesetzt.

Eventuelle CLEANUP-Blöcke werden immer direkt vor dem Abbau ihres Kontexts ausgeführt. D.h. bei Verwendung von BEFORE UNWIND nach der Ausnahmebehandlung und ansonsten davor. In einem CATCH-Block mit BEFORE UNWIND dürfen keine Anweisungen ausgeführt werden, bei denen der Kontext ohne Ausführung eventueller CLEANUP-Blöcke abgebaut wird.

  • Erlaubt sind Anweisungen wie LEAVE TO TRANSACTION, bei denen statisch erkennbar ist, dass die interne Sitzung verlassen wird. In einem solchen Fall wird die Ausnahmebehandlung unter Ausführung der CLEANUP-Blöcke ordnungsgemäß beendet, bevor die Anweisung ausgeführt wird.
  • Erlaubt sind Prozeduraufrufe. Wenn der Kontext aber während eines solchen Prozeduraufrufs gelöscht wird, kommt es zum Laufzeitfehler EXCP_HANDLER_FAILED_TO_UNWIND. Dies ist auch der Fall, wenn dort eine Anweisung ausgeführt wird, die direkt im CATCH-Block erlaubt ist. Beispielsweise kann LEAVE TO TRANSACTION direkt im CATCH-Block aber nicht in einer dort aufgerufenen Prozedur ausgeführt werden, da der Kontext ansonsten ohne Ausführung der CLEANUP-Blöcke gelöscht würde.
  • Wenn bei einer Anweisung MESSAGE zum Senden einer Nachricht der Nachrichtentyp dynamisch angegeben ist, verhält sich das ABAP-Laufzeit-Framework so, als wenn die Ausnahmebehandlung verlassen werden soll. Der Kontext wird unter Ausführung der CLEANUP-Blöcke gelöscht. Wenn dann nach Ausführung der MESSAGE-Anweisung dennoch in den CATCH-Block zurückgekehrt wird, was z.B. bei den Nachrichtentypen I und S der Fall sein kann, kommt es zur Ausnahme CX_SY_ILLEGAL_HANDLER.

Der Zusatz BEFORE UNWIND setzt bei gleichzeitiger Angabe von INTO das Attribut IS_RESUMABLE des Ausnahmeobjekts und der vorhergehenden Ausnahmeobjekte einer Verkettung mit dem Attribut PREVIOUS. Bis zur ersten wiederaufsetzbar ausgelösten Ausnahme wird IS_RESUMABLE auf den Wert von abap_true gesetzt und ansonsten auf den Wert von ABAP_FALSE.

Hinweise

  • Wenn der Zusatz BEFORE UNWIND nicht angegeben ist, wird der Kontext vor der Ausführung des CATCH-Blocks gelöscht.
  • Die Anweisung RESUME kann nur bei Behandlung einer wiederaufsetzbaren Ausnahme und nur in einem CATCH-Block verwendet werden, bei dem der Zusatz BEFORE UNWIND angegeben ist. Dies ist der einzige Fall, in dem der Kontext der Ausnahme beim Verlassen des CATCH-Blocks nicht gelöscht wird.
  • Wiederaufsetzbare Ausnahmen können auch in CATCH-Blöcken ohne den Zusatz BEFORE UNWIND behandelt werden. In diesem Fall wird der Kontext der Ausnahme vor der Behandlung gelöscht und die Anweisung RESUME kann nicht angegeben werden.
  • Die Verwendung des Zusatzes BEFORE UNWIND zu CATCH ist zwar nur bei Verwendung der Anweisung RESUME vorgeschrieben, sie ist aber prinzipiell möglich, wenn während der Ausnahmebehandlung der Kontext der Ausnahme ausgewertet werden soll bevor eventuelle Aufräumarbeiten in CLEANUP-Blöcken ausgeführt werden. Dies ist z.B. bei der Behandlung von Ressourcenengpässen sinnvoll, wenn die Freigabe von Ressourcen in CLEANUP-Blöcken den Kontext verändern und damit z.B. die Berechnung der noch freien Ressourcen im Ausnahmebehandler sinnlos machen. Außer für Protokollzwecke ist es prinzipiell aber nicht empfohlen, den Teil des Kontexts auszuwerten, der nur lokal für die Implementierung der fehlerhaften Prozedur interessant ist.
  • In einer während eines CATCH-Blocks mit BEFORE UNWIND aufgerufenen Prozedur führt jede MESSAGE-Anweisung, die eine Nachricht sendet, zum Laufzeitfehler EXCP_HANDLER_FAILED_TO_UNWIND.

Beispiel

Verwendung des Zusatz BEFORE UNWIND beim Abfangen einer wiederaufsetzbaren Ausnahme cx_demo.

Zusatz 2

... INTO oref

Wirkung

Wenn der Zusatz INTO angegeben ist, wird eine Referenz auf das Ausnahmeobjekt in oref abgelegt. Für oref kann angegeben werden:

  • Ein vorhandene Objektreferenzvariable oref, deren statischer Typ allgemeiner oder gleich der allgemeinsten der angegebenen Ausnahmeklassen sein muss.
  • Eine Inline-Deklaration mit DATA(var) oder FINAL(var). Der statische Typ der deklarierten Objektreferenzvariablen ist für eine angegebene Ausnahmeklasse diese Klasse. Wenn bei mehreren angegebenen Ausnahmeklassen eine gemeinsame Oberklasse dieser Klassen aufgeführt ist, ist diese der statische Typ von oref, ansonsten CX_ROOT.

Über die Objektreferenzvariable kann auf die Attribute und Methoden des Ausnahmeobjekts zugegriffen werden.

Wenn die Ausnahme mit RAISE RESUMABLE EXCEPTION ausgelöst wurde und auch der Zusatz BEFORE UNWIND angegeben ist, wird das Attribut IS_RESUMABLE des aktuellen Ausnahmeobjekts und aller eventuell vorhergehender Ausnahmeobjekte, auf die im Attribut PREVIOUS verwiesen wird, bis zur ersten wiederaufsetzbar ausgelösten Ausnahme auf den Wert von ABAP_TRUE gesetzt. In allen anderen Ausnahmeobjekten, wird das Attribut IS_RESUMABLE auf den Wert von ABAP_FALSE gesetzt.

Hinweis

Innerhalb eines CATCH-Blocks ohne den Zusatz BEFORE UNWIND ist das Attribut IS_RESUMABLE des Ausnahmeobjekts undefiniert.

Beispiel

Abfangen von Ausnahmen mit Inline-Deklaration einer Objektreferenzvariable. Der statische Typ dieser Variable ist cx.






Fill RESBD Structure from EBP Component Structure   PERFORM Short Reference  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 13085 Date: 20240329 Time: 023002     sap01-206 ( 168 ms )