Code: Alles auswählen.
* Zuerst werden diverse DDIC-Objekte auf Existenz geprüft und jeweils ein Flag gesetzt
* (den entsprechenden Code habe ich hier mal weggelassen, der tut nichts zur Sache)
* ......
* ......
* ......
* Ausnahmekette aus fehlgeschlagenen Prüfungen bilden
* Hier werden die einzelnen Flags innerhalb eines TRY-CATCH-Blocks geprüft und bei
* negativen Ergebnissen jeweils eine wiederaufsetzbare Exception ausgelöst, durch die
* Verwendung des Attributs PREVIOUS wird hierbei eine Ausnahmekette gebildet
TRY.
IF lv_cls_exists = abap_false.
RAISE RESUMABLE EXCEPTION TYPE zcx_qpp_error
EXPORTING
textid = zcx_qpp_error=>objtyp_class_not_found
previous = lo_exception
...
ENDIF.
IF lv_rep_exists = abap_false.
RAISE RESUMABLE EXCEPTION TYPE zcx_qpp_error
EXPORTING
textid = zcx_qpp_error=>objtyp_fugr_not_found
previous = lo_exception
...
ENDIF.
IF lv_dyn_exists = abap_false.
RAISE RESUMABLE EXCEPTION TYPE zcx_qpp_error
EXPORTING
textid = zcx_qpp_error=>objtyp_dynpro_not_found
previous = lo_exception
...
ENDIF.
IF lv_cnt_exists = abap_false.
RAISE RESUMABLE EXCEPTION TYPE zcx_qpp_error
EXPORTING
textid = zcx_qpp_error=>objtyp_container_not_found
previous = lo_exception
...
ENDIF.
CATCH BEFORE UNWIND zcx_qpp_error INTO lo_exception.
IF lo_exception->is_resumable = abap_true.
RESUME.
ENDIF.
ENDTRY.
* Wenn Prüfung Fehler ergeben hat, finale Ausnahme auslösen
* und vorhergehende Ausnahmekette mitgeben
IF lo_exception IS BOUND.
RAISE EXCEPTION TYPE zcx_qpp_error
EXPORTING
textid = zcx_qpp_error=>objtyp_check_failed
previous = lo_exception
objtyp = iv_objtyp.
ENDIF.
Code: Alles auswählen.
WHILE lo_cx IS BOUND.
INSERT INITIAL LINE INTO lt_messages ASSIGNING <fs_message> INDEX 1.
<fs_message>-text = lo_cx->get_text( ).
lo_cx = lo_cx->previous.
ENDWHILE.
Code: Alles auswählen.
try.
* Hier können verschiedene Fehler auftreten.
catch cx_root into lx_root.
raise exception type ZCX_INIT_FAILED "<-- Eigener Fehler im Rahmen der Applikation
previous = lx_root.
endtry.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
DUTZMIC
Ich verwend das (leider) auch oft soDUTZMIC hat geschrieben:Zumal die Verwendung einer einzelnen Ausnahmeklasse (ZCX_QPP_ERROR) als Container für alle in der Applikation möglichen Exceptions (dargestellt durch die Ausnahmetexte) wohl auch schon den Konventionen widerspricht, oder irre ich mich da?
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
DUTZMIC
Genau genommen ist es doch SAP Standard. Da alle Applikationen von CX_ROOT erben. Ich sehe da nirgends einen Konzeptverstoss.a-dead-trousers hat geschrieben: Ich verwend das (leider) auch oft so