Ausnahmen mit T100-Nachricht [ABAP750]
Die Verwendung von T100-Nachrichten mit Klassen basierten Ausnahmen ist von Beginn an krampfig. Alt und Neu passte immer irgendwie nicht so richtig zusammen. Paul Hardy hat sich in seinem sehr guten Buch ABAP To The Future dafür ausgesprochen, ausschließlich die neue Variante – also ohne T100-Nachricht zu verwenden. Es sprechen aber im Kampf mit den täglichen Programmiermonstern viele Dinge dafür, die Exceptions mit T100-Nachricht zu verwenden.
Umständlich
Die Verwendung von Klassen basierten Ausnahmen in Verbindung mit T100-Nachrichten ist äußerst umständlich gewesen:
DATA exc_t100 TYPE scx_t100key. TRY. exc_t100-msgid = 'OO'. exc_t100-msgno = '000'. exc_t100-attr1 = 'Test 1'. RAISE EXCEPTION TYPE cx_demo_t100 EXPORTING textid = exc_t100. CATCH cx_demo_t100 INTO DATA(error). MESSAGE error TYPE 'I'. ENDTRY.
Ab ABAP740 ist es möglich, die T100-Struktur direkt mit VALUE zu füllen:
RAISE EXCEPTION TYPE cx_demo_t100 EXPORTING textid = VALUE scx_t100key( msgid = 'OO' msgno = '000' attr1 = 'Test 2' ).
Beide Varianten haben jedoch den Nachteil, dass die Aufbereitung der Meldung mit GET_TEXT nicht korrekt ist:
Die &-Parameter sollten eigentlich nicht vorhanden sein. Meine Meinung nach handelt es sich dabei um einen Fehler in Methode CL_MESSAGE_HELPER->SET_SINGLE_MSG_VAR in der bei der Zuweisung der Attribute beim Assign die Ausnahme cx_sy_assign_cast_illegal_cast falsch interpretiert wird. Das Attribut wird dann extra mit den &-Zeichen aufgebaut:
CONCATENATE '&' arg '&' INTO target.
Rettung in Sicht
Als ich mich auf die Suche nach einer Lösung gemacht habe, bin ich über den Blog Post von Horst Keller gestoßen: ABAP News for Release 7.50 – Converting Messages into Exceptions. In diesem Beitrag beschreibt Horst die Lösung, die ab Release ABAP750 angewendet werden soll:
RAISE EXCEPTION TYPE cx_demo_t100 MESSAGE ID 'OO' NUMBER '000' WITH 'Test 3'.
Hierdurch wird die korrekte Ausgabe erzeugt:
Allerdings scheint das erst für Ausnahmen zu gehen, die auch in Release ABAP750 erzeugt wurden. Für die bisher verwendete Ausnahmeklasse CX_DEMO_T100 wird jedenfalls die Meldung ausgegeben:
Die Ausnahmeklasse muss das Interface “IF_T100_DYN_MSG” haben, um den Zusatz “WITH” verwenden zu können.
- Meine Eclipse-Plugins - 22. November 2024
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
Am einfachsten ist folgendes:
MESSAGE i113 WITH ‘Bingo’ ‘Ingo’ INTO msg.
RAISE EXCEPTION TYPE /pbs/cx_drs_cancel.
Damit werden die Message variablen der SY-Struktur gefüllt. Der Fehler wird dann ganz normal abgefangen:
CATCH /pbs/cx_drs_cancel.
MESSAGE ID sy-msgid TYPE ‘I’ NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2.