Andrzej hat geschrieben:Hallo Forum,
ich habe eine Allgemeine Fragen zum Thema Ausnahmeklassen.
Die Oberklasse aller Ausnahmeklassen ist ja CX_ROOT diese vererbt an CX_STATIC_CHECK diese wiederum an CX_DYNAMIC_CHECK und diese wieder an CX_NO_CHECK..
wann kann ich welche Ausnahmeklasse verwenden bzw. kann mir jemand mit einfachen Worten erklären wann ich welche Klasse verwenden kann?
Vielen Dank schon mal für eure Hilfe
Hallo Andrzej,
das ist doch Humbug was du da schreibst. CX_STATIC_CHECK erbt zwar von CX_ROOT - aber CX_DYNAMIC_CHECK und CX_NO_CHECK tun das auch. Da ist also gar keine Vererbungskette wie du behauptest.
Auch Ennos Aussage über die Verwendung von CX_STATIC_CHECK oder CX_DYNAMIC_CHECK ist etwas undeutlich. CX_STATIC_CHECK eine abstrakte Klasse ist und daher kann sie nicht selber sondern nur abgeleitete Klassen davon in die Signatur einer Klasse aufgenommen werden. Und auch CX_DYNAMIC_CHECK muss explizit in die Signatur aufgenommen werden, auch wenn dann nicht der Syntaxchecker schon proaktiv auf Probleme hinweist sondern dass das Problem erst zur Laufzeit auftritt.
Desweiteren halte ich Ennos Aussage leider nicht gerade für "best practice". Es ist doch gerade der Sinn, dass es Methode_3 egal sein sollte ob es in einer Aufrufkette von Method_1 liegt oder nicht. Für Method_3 ist nur wichtig, dass in Method_4 eine Ausnahme geworfen werden kann. Und dann soll Method_3 darauf auch gefälligst selber reagieren. Entweder indem die Ausnahem aus Method_4 selbst via TRY-Catch abgefangen und behandlet wird oder indem die Ausnahme in die Signatur aufgenommen wird um potentiellen Aufrufern mitzuteilen, dass diese sich gefälligst um diese Ausnahme zu kümmern haben. Nur so ist die Unabhängigkeit der Methoden bzgl. ihrer Aufrufhistorie gewährleistet.
Und wenn in Method_4 eine Ausnahme geworfen wird die in Method_3 nicht in der Signatur steht kann man die immer noch in method_1 abfangen, indem man dort einen Catch auf alle in der schnittstelle definierten Ausnahmen ( vom Typ CX_STATIC_CHECK oder CX_DYNAMIC_CHECK )und dann einen definiert um alle unerwarteten Ausnahmen abzuhandeln ( CX_ROOT ).
Und ganz zum Schluss: Und mir gefällt ein gezieltes CATCH à la
Code: Alles auswählen.
catch zcx_my_exceptionclass1. ...
catch zcx_my_exceptionclass2. ...
catch cx_root. " Für den Rest halt
besser als ein reaktives Coding
Code: Alles auswählen.
catch cx_root.
" und hier jetzt unterscheiden was tatsächlich geworfen wurde
Eine recht gute Erklärung zur Verwendung von Ausnahmeklassen von SAP findest du
hier: