Exception statt sy-subrc

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
18 Beiträge • Vorherige Seite 2 von 2 (current)
18 Beiträge Vorherige Seite 2 von 2 (current)

Re: Exception statt sy-subrc

Beitrag von rob_abc (Specialist / 106 / 27 / 44 ) »
gtoXX hat schon zum Teil recht. Wenn man RAISE EXCEPTION TYPE nutzt, scheint es nur eine zu vernachlässigende Auswirkung auf die Performance zu haben, anders als RAISE EXCEPTION NEW.

Getestet auf ABAP 757 SP4

Code: Alles auswählen.

REPORT.

CLASS lcl_report DEFINITION CREATE PRIVATE.

  PUBLIC SECTION.
    CLASS-METHODS main.

  PRIVATE SECTION.
    CLASS-DATA tadir1 TYPE SORTED TABLE OF tadir WITH NON-UNIQUE KEY obj_name.
    CLASS-DATA tadir2 TYPE SORTED TABLE OF tadir WITH NON-UNIQUE KEY obj_name.

    CLASS-METHODS do_assign.
    CLASS-METHODS do_value.
    CLASS-METHODS do_exception.
    CLASS-METHODS do_exception_type.
    CLASS-METHODS do_exception_new.
    CLASS-METHODS do_exception_with_into.
    CLASS-METHODS do_exception_type_with_into.
    CLASS-METHODS do_exception_new_with_into.
    CLASS-METHODS do_line_exists.
    CLASS-METHODS do_read_table_no_fields.
    CLASS-METHODS do_read_table_into.
    CLASS-METHODS do_read_table_fs_into.
    CLASS-METHODS do_read_table_ref_into.
    CLASS-METHODS do_ref.

ENDCLASS.


CLASS lcl_report IMPLEMENTATION.
  METHOD main.
    SELECT * FROM tadir INTO TABLE tadir1 UP TO 1000000 ROWS.
    tadir2 = tadir1.

    do_line_exists( ).
    do_assign( ).
    do_value( ).
    do_ref( ).
    do_read_table_no_fields( ).
    do_exception( ).
    do_exception_type( ).
    do_exception_new( ).
    do_exception_with_into( ).
    do_exception_type_with_into( ).
    do_exception_new_with_into( ).
    do_read_table_into( ).
    do_read_table_fs_into( ).
    do_read_table_ref_into( ).
  ENDMETHOD.

  METHOD do_assign.
    LOOP AT tadir1 ASSIGNING FIELD-SYMBOL(<line>).
      ASSIGN tadir2[ obj_name = |{ <line>-obj_name }1| ] TO FIELD-SYMBOL(<fs1>).
      IF sy-subrc <> 0.
        " do error handling
      ENDIF.
    ENDLOOP.
  ENDMETHOD.

  METHOD do_value.
    LOOP AT tadir1 ASSIGNING FIELD-SYMBOL(<line>).
      DATA(line) = VALUE #( tadir2[ obj_name = |{ <line>-obj_name }1| ] OPTIONAL ).
      IF line IS INITIAL.
        " do error handling
      ENDIF.
    ENDLOOP.
  ENDMETHOD.

  METHOD do_exception.
    LOOP AT tadir1 ASSIGNING FIELD-SYMBOL(<line>).
      TRY.
          DATA(line) = VALUE #( tadir2[ obj_name = |{ <line>-obj_name }1| ] ).
        CATCH cx_sy_itab_line_not_found.
          " do error handling
      ENDTRY.
    ENDLOOP.
  ENDMETHOD.

  METHOD do_exception_new.
    LOOP AT tadir1 ASSIGNING FIELD-SYMBOL(<line>).
      ASSIGN tadir2[ obj_name = |{ <line>-obj_name }1| ] TO FIELD-SYMBOL(<fs1>).
      IF sy-subrc <> 0.
        TRY.
            RAISE EXCEPTION NEW cx_sy_itab_line_not_found( ).
          CATCH cx_sy_itab_line_not_found.
            " do error handling
        ENDTRY.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.

  METHOD do_exception_type.
    LOOP AT tadir1 ASSIGNING FIELD-SYMBOL(<line>).
      ASSIGN tadir2[ obj_name = |{ <line>-obj_name }1| ] TO FIELD-SYMBOL(<fs1>).
      IF sy-subrc <> 0.
        TRY.
            RAISE EXCEPTION type cx_sy_itab_line_not_found.
          CATCH cx_sy_itab_line_not_found.
            " do error handling
        ENDTRY.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.

  METHOD do_line_exists.
    LOOP AT tadir1 ASSIGNING FIELD-SYMBOL(<line>).
      IF NOT line_exists( tadir2[ obj_name = |{ <line>-obj_name }1| ] ).
        " do error handling
      ENDIF.
    ENDLOOP.
  ENDMETHOD.

  METHOD do_read_table_no_fields.
    LOOP AT tadir1 ASSIGNING FIELD-SYMBOL(<line>).
      READ TABLE tadir1 WITH KEY obj_name = |{ <line>-obj_name }1| TRANSPORTING NO FIELDS.
      if sy-subrc <> 0.
        " do error handling
      ENDIF.
    ENDLOOP.
  ENDMETHOD.

  METHOD do_ref.
    LOOP AT tadir1 ASSIGNING FIELD-SYMBOL(<line>).
      DATA(line) = REF #( tadir2[ obj_name = |{ <line>-obj_name }1| ] OPTIONAL ).
      IF line IS NOT BOUND.
        " do error handling
      ENDIF.
    ENDLOOP.
  ENDMETHOD.
  METHOD do_exception_new_with_into.
    LOOP AT tadir1 ASSIGNING FIELD-SYMBOL(<line>).
      ASSIGN tadir2[ obj_name = |{ <line>-obj_name }1| ] TO FIELD-SYMBOL(<fs1>).
      IF sy-subrc <> 0.
        TRY.
            RAISE EXCEPTION NEW cx_sy_itab_line_not_found( ).
          CATCH cx_sy_itab_line_not_found into DATA(e).
            " do error handling
        ENDTRY.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.

  METHOD do_exception_type_with_into.
    LOOP AT tadir1 ASSIGNING FIELD-SYMBOL(<line>).
      ASSIGN tadir2[ obj_name = |{ <line>-obj_name }1| ] TO FIELD-SYMBOL(<fs1>).
      IF sy-subrc <> 0.
        TRY.
            RAISE EXCEPTION type cx_sy_itab_line_not_found.
          CATCH cx_sy_itab_line_not_found into DATA(e).
            " do error handling
        ENDTRY.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.

  METHOD do_exception_with_into.
    LOOP AT tadir1 ASSIGNING FIELD-SYMBOL(<line>).
      TRY.
          DATA(line) = VALUE #( tadir2[ obj_name = |{ <line>-obj_name }1| ] ).
        CATCH cx_sy_itab_line_not_found into DATA(e).
          " do error handling
      ENDTRY.
    ENDLOOP.
  ENDMETHOD.

  METHOD do_read_table_into.
    LOOP AT tadir1 ASSIGNING FIELD-SYMBOL(<line>).
      READ TABLE tadir1 WITH KEY obj_name = |{ <line>-obj_name }1| INTO DATA(line).
      if sy-subrc <> 0.
        " do error handling
      ENDIF.
    ENDLOOP.
  ENDMETHOD.

  METHOD do_read_table_fs_into.
    LOOP AT tadir1 ASSIGNING FIELD-SYMBOL(<line>).
      READ TABLE tadir1 WITH KEY obj_name = |{ <line>-obj_name }1| ASSIGNING FIELD-SYMBOL(<fs>).
      if sy-subrc <> 0.
        " do error handling
      ENDIF.
    ENDLOOP.
  ENDMETHOD.

  METHOD do_read_table_ref_into.
    LOOP AT tadir1 ASSIGNING FIELD-SYMBOL(<line>).
      READ TABLE tadir1 WITH KEY obj_name = |{ <line>-obj_name }1| REFERENCE INTO DATA(line).
      if sy-subrc <> 0.
        " do error handling
      ENDIF.
    ENDLOOP.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  lcl_report=>main( ).

Folgende Benutzer bedankten sich beim Autor rob_abc für den Beitrag (Insgesamt 5):
a-dead-trouserstarblack_adeptqyurryusRomaniac


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


Re: Exception statt sy-subrc

Beitrag von DeathAndPain (Top Expert / 1939 / 257 / 412 ) »
rob_abc hat geschrieben:Wenn man RAISE EXCEPTION TYPE nutzt
Diese Möglichkeit hat man im vorliegenden Fall aber nicht. Das geht nur, wenn Du "mutwillig" per RAISE eine Exception wirfst. Wenn Du aber - wie in dem Problem, um das es in diesem Thread geht - eine Zuweisung hast und diese mit einer Exception auf die Bretter gehen lässt und diese Exception dann mit einem CATCH abfängst, dann hast Du keinen Einfluss darauf, um was für eine Art Exception es sich handelt.

Eine Syntax zu verwenden, die den SY-SUBRC setzt und prüft, ist da deutlich effizienter.

Re: Exception statt sy-subrc

Beitrag von msfox (Specialist / 364 / 56 / 74 ) »
Vielen Dank euch für die Unterstützung. Als Beratungs"auftrag" habe ich die Performance-Auswertung am Freitag an das Entwicklungsteam vom Kunden geschickt. Mal sehen, ob es hilft, um vielleicht mögliche Vorgaben oder "persönliche Vorlieben" der Entwickler* zu ändern. Klar, im Beispiel wurden 1 Mill READ's auf eine Tabelle mit 1 Mill Einträgen im LOOP gemacht. Das Coding aber auch in Schnittstellen verwendet, wo Massendaten verarbeitet werden. Ich gehe mal davon aus, dass genau ein solche Excption-Handling nicht nur 1x gemacht wurde, sondern häufiger. Damit schaukelt sich das Problem schon auf...
--
*Einige Entwickler kommen aus anderen Programmiersprachen, wo so etwas vielleicht "üblich" ist. Aber in ABAP sollte man sich schon der Syntax der SAP beugen und nicht alles auf biegen und brechen auf ABAP OO umstellen, nur weil man es kann.

Vergleichbare Themen

2
Antw.
2834
Views
sy-subrc oder syst-subrc?
von genua » 31.10.2007 11:55 • Verfasst in ABAP® für Anfänger
8
Antw.
6119
Views
MB_CREATE_GOODS_MOVEMENT mit SUBRC 5
von Adrian » 20.04.2015 14:34 • Verfasst in ABAP® für Anfänger
2
Antw.
3223
Views
Übersicht zu sy-subrc
von KleinerEisbaer » 22.07.2008 16:48 • Verfasst in ABAP® für Anfänger
1
Antw.
4998
Views
Unterprogramm + sy-subrc setzen
von fabis » 26.01.2012 18:10 • Verfasst in ABAP® für Anfänger
7
Antw.
2638
Views
AlV Grid Sy-subrc = 4 MIST!!!
von tho_died » 12.06.2007 13:20 • Verfasst in ABAP® Core

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 / 516
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2149
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8744