exception handling - wie am Besten?

Getting started ... Alles für einen gelungenen Start.
4 Beiträge • Seite 1 von 1
4 Beiträge Seite 1 von 1

exception handling - wie am Besten?

Beitrag von Legxis (Specialist / 160 / 90 / 28 ) »
Während eines anderem Threads sind wir auf das Thema Ausnahmebehandlung gekommen und mir ist aufgefallen, dass es bei mir da noch was zu tun gibt.
Ich habe umhergesucht und viele viele verschiedene Möglichkeiten gesehen, Exceptions zu behandeln, und das hat mich nur noch mehr verwirrt.
Deshalb wollte ich mal fragen, wie ihr das macht, was die beste Methode ist, etc. am besten mit Codebeispiel.

So habe ich es bisher am Meisten gesehen und dieses Beispiel verstehe ich auch, aber ist das auch ein guter Weg, die Ausnahme zu behandeln?

Code: Alles auswählen.

TRY.
result = value1 / value2.
  
CATCH cx_sy_zerodivide INTO ex_ref.
    msg_text = ex_ref->get_text( ).

  CATCH cx_sy_conversion_no_number INTO ex_ref.
    msg_text = ex_ref->get_text( ).

  CATCH cx_root INTO ex_ref.
    msg_text = ex_ref->get_text( ).

ENDTRY.

IF NOT msg_text IS INITIAL.
  WRITE / msg_text.
ELSE.
  WRITE: / result.
ENDIF.
Die Diskussion, die die Frage gestartet hat:
4byte hat geschrieben:
Legxis hat geschrieben:

Code: Alles auswählen.

* Tabelle direkt sortiert ausgeben (damit auch gleiche Spalteninhalte zusammenfügen)
  TRY.
    go_sort = go_alv->get_sorts( ).
  CATCH cx_salv_data_error INTO gx_salv_data_error.
  ENDTRY.

  TRY.
    go_sort->add_sort('VBELN').
  CATCH cx_salv_data_error INTO gx_salv_data_error.
  CATCH cx_salv_not_found  INTO gx_salv_not_found.
  CATCH cx_salv_existing   INTO gx_salv_existing.
  ENDTRY.
Ist es eigentlich okay, so mehrere CATCH hintereinander zu schreiben?
So kannst du jetzt für jede auftretende Exception eine separate Behandlung durchführen.
CATCH cx_salv_data_error INTO gx_salv_data_error.
--> Behandle cx_salv_data_error
CATCH cx_salv_not_found INTO gx_salv_not_found.
--> Behandle cx_salv_not_found

Bzw. Wenn wird nur die Ausnahme behandelt, die zuerst auftretet :P

Wenn du alle Exceptions gleich behandelt möchtest, kannst du sie auch zuammenfassen.
CATCH cx_salv_not_found
cx_salv_existing
cx_salv_data_error.
--> Tue irgendwas
( SAP ECC 6.0, NetWeaver 7.0, ohne unicode, ohne support/enhancement packages )

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: exception handling - wie am Besten?

Beitrag von 4byte (Specialist / 124 / 37 / 35 ) »
Hey Legxis,

wie ich schon meinem Beitrag erwähnt hab, finde ich die genannte Methode
catch fehler1
--> tue was

catch fehler2
--> tue was2

catch fehler3
-->tue was3

sehr angenehm. Es geht ja nicht nur um mögliche unterschiedliche Feherlausgaben für den Benutzer, sondern auch darum wie sich dein Programm im Fehlerfall zu Verhalten hat:
- Müssen DB Operationen zurückgenommen werden (Rollback)?
- Müssen andere Aufräumarbeiten durchgeführt werden(Werte initial setzten)?
- etc...

Meine Erfahrung mit Exception sind aber auch noch sehr begrenzt. Daher die Bitte an das Forum. Ergänzungen etc bitte :D

Grüße 4Byte
Es gibt 10 Menschen die binär verstehen :)

Re: exception handling - wie am Besten?

Beitrag von ralf.wenzel (Top Expert / 3924 / 200 / 280 ) »
Wenn du eh CX_ROOT catcht und überall dasselbe machst, kannst du dir die anderen auch schenken. Irgendwie verstehe ich deine Frage nicht wirklich.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: exception handling - wie am Besten?

Beitrag von gtoXX (Specialist / 213 / 44 / 36 ) »
Legxis hat geschrieben:Während eines anderem Threads sind wir auf das Thema Ausnahmebehandlung gekommen und mir ist aufgefallen, dass es bei mir da noch was zu tun gibt.
Ich habe umhergesucht und viele viele verschiedene Möglichkeiten gesehen, Exceptions zu behandeln, und das hat mich nur noch mehr verwirrt.
Deshalb wollte ich mal fragen, wie ihr das macht, was die beste Methode ist, etc. am besten mit Codebeispiel.

So habe ich es bisher am Meisten gesehen und dieses Beispiel verstehe ich auch, aber ist das auch ein guter Weg, die Ausnahme zu behandeln?

Es gibt mehrere Varianten, je nachdem wie deine Architektur aussehen soll. Dein Beispiel ist leider nicht sehr gut gewählt.

Grundsätzlich muss man sich fragen, ob alle Fehler tatsächlich von der jeweiligen Methode / Aufrufstelle behandelt werden sollen. Ein pauschaler Catch auf CX_ROOT macht nur Sinn, wenn ein Dir unbekannter Fehler tatsächlich keine Auswirkungen auf den weiteren Programmlauf haben soll, oder in dem Fall gezielt das Programm beendet wird.


Der Vorteil der klassenbasierten Ausnahmen ist, ja, das der Fehler entlang der Aufrufhierarchie weiter gegeben wird. Wenn man vernünftig atomar arbeitet, würde so ein CX_ROOT nur an oberster Ebene deiner Programmhierarchie behandelt werden müssen, was dem DRY und KISS Prinzip entspricht.

Es gilt also die Fragen zu stellen und zu behandeln : Macht bei einem Fehler in einer unteren Hierarchie es noch Sinn, das Programm fortzusetzen ? Kann die Hierarchieebene auf der ich gerade bin, entscheiden, was mit dem Fehler zu tun ist ?

Ist dein Coding Teil des Hauptprogrammes ist das so ja noch ok. Es verhindert einen allgemeinen Absturz des Programmes.
Das Abfangen bekannter Fehler mit einer Unterscheidung durch mehrere CATCH Anweisungen macht nur Sinn, wenn tatsächlich in den Einzelfällen eine unterschiedliche
Behandlung erfolgen soll. Ansonsten kann man ruhig zusammenfassen. In deinem Fall würde CX_ROOT ja nur gecatcht, wenn ein anderer als die beiden spezifischeren Fehler auftritt.

Ist dein Aufruf jedoch in einer Methode z.b. eines Services, sollte entweder a) die Service-Methode alle bekannten Fehler die zu behandeln sind auch in ihrer Definitionen nach außen sichtbar propagieren. Der Aufrufer kann dann selbst entscheiden, was er damit macht und wieder selber unterscheiden ( in dem Fall würde innerhalb der Methode gar nichts gecatcht werden ) oder b) die Methode eine übergeordnete Fehlerklasse propagieren und eine Iteration über das Previous-Attribut erfolgen.

Eine Exception kann ja auch RESUMABLE sein, wenn z.b. das Ganze in einer Schleife steckt und ich gern durch eine gesamte Liste iterieren möchte um entweder Fehler gesammelt auszugeben oder mit den Positivfällen, weiter arbeiten zu können.

Grundsätzlich kann ein untergeordneter Bestandteil ( z.b. die Methode eines Services ) selten entscheiden ob das umliegende Programm weiterarbeiten kann, wenn der Fehler existiert. Also würde ich mir gut überlegen ob und wo ich CX_ROOT catche. Warum alte ABAPler ( zu denen ich auch gehöre ^^ ) OO oft skeptisch gegenüber stehen ist,
nach meiner Meinung, dass mehr Zeit in ein Programmdesign gesteckt werden muss und sollte.

Gruß,

GTO

PS: Das Naming mit ex_ref finde ich subobtimal. Es wird ja schliesslich ein Objekt erzeugt und keine Referenz. Daher wäre obj_cx o.ä. besser .

Folgende Benutzer bedankten sich beim Autor gtoXX für den Beitrag (Insgesamt 2):
4byteLegxis

"Code lügt nicht ^^"

Seite 1 von 1

Vergleichbare Themen

2
Antw.
1286
Views
Exception Handling in einer Klasse
von Aba » 30.08.2019 07:54 • Verfasst in ABAP® für Anfänger
7
Antw.
3515
Views
Exception Handling bei redefinierter Methode
von SAP4LIFE » 11.11.2016 09:50 • Verfasst in ABAP Objects®
1
Antw.
2022
Views
Exception Handling FuBa test
von ichse18577 » 23.04.2019 13:15 • Verfasst in ABAP® Core
1
Antw.
906
Views
Wie am besten Daten abfragen?
von dyv » 21.10.2014 09:21 • Verfasst in ABAP® für Anfänger
1
Antw.
1419
Views
Handling Unit Management
von HandlingUnit » 15.01.2007 21:01 • Verfasst in ABAP® Core

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
Gestern von Bright4.5 1 / 535
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2162
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8757