ABAP EXIT-Anweisung: Schleifen und Unterprogramme sofort beenden

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

Die EXIT-Anweisung ist eine Kontrollanweisung in ABAP, die dazu dient, die Ausführung eines bestimmten Verarbeitungsblocks sofort und unbedingt zu beenden. Die Hauptanwendungsfälle für EXIT sind:

  1. Beenden von Schleifen: Vorzeitiges Verlassen einer kompletten DO, WHILE oder LOOP AT ... ENDLOOP Schleife.
  2. Beenden von Unterprogrammen: Vorzeitiges Verlassen eines FORM ... ENDFORM Unterprogramms.

Im Gegensatz zu CONTINUE (das nur den aktuellen Schleifendurchlauf überspringt) oder CHECK (das bedingt überspringt oder verlässt), beendet EXIT den gesamten umschließenden Block (Schleife oder FORM) endgültig.

Syntax

Die grundlegende und am häufigsten verwendete Syntax ist:

EXIT.

Es gibt auch spezialisierte Formen wie EXIT FROM STEP-LOOP oder EXIT FROM SQL, die aber in der modernen ABAP-Entwicklung seltener relevant sind.

Funktionsweise und Verhalten

Das Verhalten von EXIT hängt vom Kontext ab:

1. Innerhalb einer Schleife (DO, WHILE, LOOP AT)

  • EXIT beendet sofort die gesamte Schleife, unabhängig davon, wie viele Durchläufe noch geplant wären.
  • Die Programmausführung wird mit der ersten Anweisung nach dem schließenden Statement der Schleife (ENDDO, ENDWHILE, ENDLOOP) fortgesetzt.
  • Bei verschachtelten Schleifen (eine Schleife innerhalb einer anderen) beendet EXIT immer nur die innerste Schleife, in der es direkt steht.

2. Innerhalb eines Unterprogramms (FORM ... ENDFORM)

  • EXIT beendet sofort das gesamte Unterprogramm.
  • Die Kontrolle kehrt zum aufrufenden Programmteil zurück, und zwar zur Anweisung direkt **nach dem PERFORM-Aufruf **.

3. In anderen Kontexten

  • Die Verwendung von EXIT direkt in Ereignisblöcken (z.B. START-OF-SELECTION) zum Beenden des gesamten Programms ist zwar technisch möglich, gilt aber als schlechter Programmierstil und ist veraltet. Dafür sollte LEAVE PROGRAM verwendet werden.
  • In modernen ABAP-Methoden (METHOD ... ENDMETHOD) wird EXIT nicht zum Verlassen der Methode verwendet. Dafür ist die Anweisung RETURN vorgesehen.

Abgrenzung zu anderen Kontrollanweisungen

Es ist wichtig, EXIT von ähnlichen Anweisungen zu unterscheiden:

  • CONTINUE: (Nur in Schleifen) Überspringt den Rest des aktuellen Schleifendurchlaufs und startet den nächsten Durchlauf. Die Schleife selbst wird nicht beendet.
  • CHECK <bedingung>.: (In Schleifen/FORMs) Überspringt den Rest des Durchlaufs (CONTINUE) oder verlässt das FORM (EXIT), aber nur wenn die Bedingung falsch ist.
  • RETURN: (In Methoden/Funktionsbausteinen) Beendet die Ausführung der Methode oder des Funktionsbausteins und kehrt zum Aufrufer zurück.
  • LEAVE PROGRAM: Beendet das gesamte ABAP-Programm.
  • EXIT: Beendet die gesamte Schleife oder das gesamte FORM unbedingt.

Beispiele

1. EXIT in LOOP AT (Suche abbrechen)

DATA: product_list TYPE STANDARD TABLE OF string,
search_item TYPE string VALUE 'Banana'.
APPEND 'Apple' TO product_list.
APPEND 'Pear' TO product_list.
APPEND 'Banana' TO product_list.
APPEND 'Orange' TO product_list.
WRITE: / 'Searching for:', search_item.
DATA found TYPE abap_bool VALUE abap_false.
LOOP AT product_list INTO DATA(product).
WRITE: / 'Checking:', product.
IF product = search_item.
found = abap_true.
WRITE: ' -> Found! Exiting loop.'.
EXIT. " Exit the LOOP AT statement
ENDIF.
ENDLOOP.
IF found = abap_true.
WRITE: / 'Item was found in the list.'.
ELSE.
WRITE: / 'Item was not found.'.
ENDIF.
WRITE: / 'Processing continues after the loop.'.

Ausgabe:

Searching for: Banana
Checking: Apple
Checking: Pear
Checking: Banana -> Found! Exiting loop.
Item was found in the list.
Processing continues after the loop.

2. EXIT in WHILE (Bedingung im Schleifenkörper)

DATA counter TYPE i VALUE 0.
DATA limit TYPE i VALUE 5.
WHILE counter < 10. " Theoretisch bis 9
counter = counter + 1.
WRITE: / 'WHILE loop, counter:', counter.
IF counter = limit.
WRITE: ' -> Limit reached, exiting WHILE loop.'.
EXIT. " Exit the WHILE loop
ENDIF.
" Dieser Teil wird nach EXIT nicht mehr erreicht
WRITE: ' -> Processing normally.'.
ENDWHILE.
WRITE: / 'After WHILE loop.'.

Ausgabe:

WHILE loop, counter: 1 -> Processing normally.
WHILE loop, counter: 2 -> Processing normally.
WHILE loop, counter: 3 -> Processing normally.
WHILE loop, counter: 4 -> Processing normally.
WHILE loop, counter: 5 -> Limit reached, exiting WHILE loop.
After WHILE loop.

3. EXIT in FORM (Unterprogramm verlassen)

START-OF-SELECTION.
PERFORM check_value USING 50.
PERFORM check_value USING -10. " Fehlerfall
PERFORM check_value USING 100.
FORM check_value USING iv_value TYPE i.
WRITE: / 'FORM entered with value:', iv_value.
IF iv_value < 0.
WRITE: ' -> Invalid value, exiting FORM.'.
EXIT. " Exit the FORM subroutine
ENDIF.
" Dieser Teil wird nur für positive Werte erreicht
WRITE: ' -> Value is valid, processing...'.
ENDFORM.
WRITE: / 'Main program continues.'.

Ausgabe:

FORM entered with value: 50
-> Value is valid, processing...
FORM entered with value: -10
-> Invalid value, exiting FORM.
FORM entered with value: 100
-> Value is valid, processing...
Main program continues.

4. EXIT in verschachtelten Schleifen

DO 2 TIMES. " Outer loop
DATA(outer_idx) = sy-index.
WRITE: / 'Outer Loop:', outer_idx.
DO 3 TIMES. " Inner loop
DATA(inner_idx) = sy-index.
WRITE: | Inner Loop: { inner_idx }|.
IF outer_idx = 1 AND inner_idx = 2.
WRITE: ' -> Exiting INNER loop!'.
EXIT. " Exits the inner DO loop only
ENDIF.
ENDDO. " End of inner loop
WRITE: | -> After Inner Loop (Outer: { outer_idx })|.
ENDDO. " End of outer loop

Ausgabe:

Outer Loop: 1
Inner Loop: 1
Inner Loop: 2 -> Exiting INNER loop!
-> After Inner Loop (Outer: 1)
Outer Loop: 2
Inner Loop: 1
Inner Loop: 2
Inner Loop: 3
-> After Inner Loop (Outer: 2)

Wichtige Hinweise / Best Practice

  • EXIT ist unbedingt. Es beendet den Block sofort, wenn es erreicht wird.
  • Daher wird EXIT fast ausschließlich innerhalb einer IF-Anweisung platziert, um den Abbruch von einer bestimmten Bedingung abhängig zu machen (IF <condition> THEN EXIT. ENDIF.).
  • Verwende EXIT gezielt, wenn die Fortsetzung der Schleifen- oder FORM-Verarbeitung keinen Sinn mehr ergibt oder ein Abbruch erforderlich ist (z.B. nach dem Finden eines Elements, bei einem Fehler).
  • Kenne die Alternativen (CONTINUE, CHECK, RETURN, LEAVE PROGRAM) und setze sie entsprechend ihrem Zweck ein.