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:
- Beenden von Schleifen: Vorzeitiges Verlassen einer kompletten
DO,WHILEoderLOOP AT ... ENDLOOPSchleife. - Beenden von Unterprogrammen: Vorzeitiges Verlassen eines
FORM ... ENDFORMUnterprogramms.
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)
EXITbeendet 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
EXITimmer nur die innerste Schleife, in der es direkt steht.
2. Innerhalb eines Unterprogramms (FORM ... ENDFORM)
EXITbeendet 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
EXITdirekt 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 sollteLEAVE PROGRAMverwendet werden. - In modernen ABAP-Methoden (
METHOD ... ENDMETHOD) wirdEXITnicht zum Verlassen der Methode verwendet. Dafür ist die AnweisungRETURNvorgesehen.
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: BananaChecking: AppleChecking: PearChecking: 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 loopAusgabe:
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
EXITist unbedingt. Es beendet den Block sofort, wenn es erreicht wird.- Daher wird
EXITfast ausschließlich innerhalb einerIF-Anweisung platziert, um den Abbruch von einer bestimmten Bedingung abhängig zu machen (IF <condition> THEN EXIT. ENDIF.). - Verwende
EXITgezielt, 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.