ABAP Tipp - RFC Fehlerbehandlung
Wie behandelt man eigentlich Fehler, wenn man über eine Destination im Funktionsbaustein kommuniziert? Mehr dazu in unserem Tipp.
Inhaltsverzeichnis
Der Aufruf von Funktionsbausteinen gehört zum Standard in der Verarbeitung, vor allem wenn du die Standard BAPIs der SAP nutzt. Dazu können die BAPIs meist auch auf anderen Systemen aufgerufen werden, um die Verarbeitung dort durchzuführen.
Einleitung
In Reviews sehen wir oft RFC Aufrufe, bei denen die Fehlerbehandlung nicht sauber implementiert wurde. In vielen Fällen findet man die folgende Implementierung des Aufrufs.
CALL FUNCTION 'BAPI_USER_ACTGROUPS_ASSIGN' DESTINATION is_roles-destination
EXPORTING
username = is_roles-userid
TABLES
activitygroups = is_roles-activitygroups
return = rt_return
EXCEPTIONS
OTHERS = 1.
Da eine Destination verwendet wird, handelt es sich um einen RFC Aufruf, die Fehlermeldungen werden in diesem Fall über den SUBRC zurückgegeben. Außer OTHERS, gibt es keine weitere EXCEPTION beim Aufruf des Funktionsbausteins.
Fehler
Neben den klassischen Fehlermeldungen aus dem Funktionsbaustein, kann es im RFC Szenario auch zu allgemeinen Fehlern kommen:
- Aufrufendes System nicht vorhanden
- RFC-Verbindung nicht korrekt konfiguriert
- Keine Berechtigungen für S_RFC oder S_RFCACL
Werden diese Fehler nicht sauber abgefangen, kommt es zu einem Dump beim Aufruf des Funktionsbausteins und die Verarbeitung kann nicht sauber beendet werden.
Implementierung
Wie sieht nun eigentlich die korrekte Implementierung des Aufrufs aus? Dazu muss man ein wenig in der Dokumentation suchen, um im richtigen Abschnitt fündig zu werden. Neben OTHERS gibt es noch zwei andere EXCEPTIONS, die der Funktionsbaustein setzen kann und dazu noch eine Übergabe der Fehlermeldung an eine Meldungsvariable.
DATA ld_message TYPE c LENGTH 200.
CALL FUNCTION 'BAPI_USER_ACTGROUPS_ASSIGN' DESTINATION is_roles-destination
EXPORTING
username = is_roles-userid
TABLES
activitygroups = is_roles-activitygroups
return = lt_return
EXCEPTIONS
system_failure = 1 MESSAGE ld_message
communication_failure = 2 MESSAGE ld_message
OTHERS = 3.
IF sy-subrc <> 0.
" Log ld_message
ENDIF.
Wird nun eine Ausnahme ausgelöst, findest du die Fehlermeldung in LD_MESSAGE wieder und kannst sie ausgeben oder im Log protokollieren.
Fazit
Die Behandlung von Fehlern beim Aufruf ist nicht schwer, unterscheidet sich aber zur klassischen Fehlerbehandlung, weshalb sie oft vergessen wird. Im Fehlerfall hilft es aber, das Programm sauber zu beenden und den Fehler zu protokollieren.
Quelle:
SAP Dokumentation - CALL Function ... parameter list