Fehler bei CATCH-Abfangung Thema ist als GELÖST markiert

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

Fehler bei CATCH-Abfangung

Beitrag von STDIN (ForumUser / 25 / 12 / 0 ) » 02.04.2020 12:48
Hallo zusammen,

über einen Selection-Screen übergebe ich meinen Report einen Dateipfad. Um zunächst zu überprüfen ob dieses Verzeichnis existiert, verwende ich die Klasse cl_hcs_directory_access und die dazugehörige Methode directory_exists. Dies funktioniert auch soweit, bis ich versuche den CATCH abzufangen. Das heißt, wenn ich ein existierendes Verzeichnis übergebe, bekomme ich eine Fehlermeldung, dass ein Fehler während des Zugriffs auf mein Verzeichnis aufgetreten ist. Wenn ich es debugge, komme ich innerhalb der Klasse auf den Fehler: Last dir scan has not be finished.
Kann mir jemand weiterhelfen, was ich beim Abfangen des CASE falsch mache?

Code: Alles auswählen.

DATA: ld_text TYPE string.
DATA: lr_catch TYPE REF TO cx_hcs_directory_access_error.

TRY.
      CALL METHOD cl_hcs_directory_access=>directory_exists
        EXPORTING
          i_name   = pp_filepath
        RECEIVING
          r_exists = lv_r_exists.
    CATCH cx_hcs_directory_access_error INTO lr_catch.
      ld_text = lr_catch->get_text( ).
ENDTRY.

Vielen Dank schon mal. :)
Zuletzt geändert von STDIN am 02.04.2020 13:28, insgesamt 2-mal geändert.


Re: Fehler bei CATCH-Abfangung

Beitrag von STDIN (ForumUser / 25 / 12 / 0 ) » 02.04.2020 12:53
Beim Aufruf von get_longtext( ) statt get_text( ) funktioniert es.

Aber kann mir evtl. jemand erklären, warum es bei der Verwendung von get_text( ) zu einem Fehler kommt?



Da war ich wohl zu schnell mit der Lösung...

Update: Beim Aufruf von get_longtext( ) statt get_text( ) funktioniert es einmal und einmal nicht.

Re: Fehler bei CATCH-Abfangung

Beitrag von jocoder (Specialist / 181 / 3 / 44 ) » 02.04.2020 14:17
Das mit dem Aufruf get_longtext() oder get_text() hat nichts mit der Fehlerursache zu tun.
Der Fehler hat vermutlich eher damit zu tun, dass die C-Funktion C_DIR_READ_FINISHED nicht ordnungsgemäß abgeschlossen wurde. Was liefert denn ein Breakpoint vor der C-Funktion C_DIR_READ_START (Variablen l_errno, l_errmsg)?

Re: Fehler bei CATCH-Abfangung

Beitrag von STDIN (ForumUser / 25 / 12 / 0 ) » 02.04.2020 14:41
jocoder hat geschrieben:
02.04.2020 14:17
Das mit dem Aufruf get_longtext() oder get_text() hat nichts mit der Fehlerursache zu tun.
Der Fehler hat vermutlich eher damit zu tun, dass die C-Funktion C_DIR_READ_FINISHED nicht ordnungsgemäß abgeschlossen wurde. Was liefert denn ein Breakpoint vor der C-Funktion C_DIR_READ_START (Variablen l_errno, l_errmsg)?

Kann ich momentan leider nicht sagen, da es mittlerweile dauerhaft klappt (ohne, dass ich etwas weiter verändert habe).

Re: Fehler bei CATCH-Abfangung

Beitrag von STDIN (ForumUser / 25 / 12 / 0 ) » 06.04.2020 10:57
Ich wollte eben einen Fehlerfall abfangen und habe deswegen ein nicht existierendes Verzeichnis angegeben. Während des debuggens erkennt er, dass das Verzeichnis nicht existiert (C_DIR_READ_START):

L_ERRNO: 2
L_ERRMSG: opendir: No such file or directory

Allerdings springt er nachfolgend in meinem Report über den Catch hinweg und führt das Programm trotzdem aus.

Re: Fehler bei CATCH-Abfangung

Beitrag von edwin (Specialist / 293 / 7 / 62 ) » 06.04.2020 18:06
Hi,
schaue dir mal den Rückgabeparameter R_EXISTS an, da bekommst du mitgeteilt, ob das Verzeichnis existiert oder nicht, die Exception CX_HCS_DIRECTORY_ACCESS_ERROR wird bei nicht existierendem Verzeichnis nicht geworfen. Schau Dir mal den CATCH Block der Methode "DIRECTORY_EXISTS" und da steht :
IF l_exception->textid <> cx_hcs_directory_access_error=>directory_could_not_be_read. RAISE EXCEPTION..

Code: Alles auswählen.

...
    CATCH cx_hcs_directory_access_error INTO l_exception.
      IF l_exception->textid <> cx_hcs_directory_access_error=>directory_could_not_be_read.
        RAISE EXCEPTION TYPE cx_hcs_directory_access_error
          EXPORTING
            previous      = l_exception
            directoryname = i_name.
      ENDIF
...
die Exception CX_HCS_DIRECTORY_ACCESS_ERROR wird nur bei schwerwiegenden Fehlern geworfen, siehe die Methode "GET_DIRECTORY_CONTENT" eine Stufe tiefer:

Code: Alles auswählen.

...
    when 2 or " Cannot use that pattern.
         3 or " Internal error.
         4.   " Last dir scan has not be finished.
      l_subrc = sy-subrc.
      raise exception type cx_hcs_directory_access_error
        exporting
          textid        = cx_hcs_directory_access_error=>internal_error
          internalerror = l_subrc
          errno         = l_errno
          errmsg        = l_errmsg.
..
* oder bei :
    call 'C_DIR_READ_NEXT' id 'TYPE'   field l_type        "#EC CI_CCALL
                           id 'NAME'   field l_name
                           id 'LEN'    field l_len
*                           ID 'OWNER'  FIELD l_owner
                           id 'MTIME'  field l_mtime
*                           ID 'MODE'   FIELD l_mode
                           id 'ERRNO'  field l_errno
                           id 'ERRMSG' field l_errmsg.

    case sy-subrc.

      when 1.   " No more slots available.
        exit.

      when 3.   " Internal error.
          l_subrc = sy-subrc + 10.
          raise exception type cx_hcs_directory_access_error
            exporting
              textid        = cx_hcs_directory_access_error=>internal_error
              internalerror = l_subrc
              errno         = l_errno
              errmsg        = l_errmsg.
...
willst du die Exception haben, solltest du direkt cl_hcs_directory_access=>get_directory_content aufrufen, dann bekommst du sie auch

/Edwin

Folgende Benutzer bedankten sich beim Autor edwin für den Beitrag:
STDIN (07.04.2020 14:24)


Re: Fehler bei CATCH-Abfangung

Beitrag von STDIN (ForumUser / 25 / 12 / 0 ) » 07.04.2020 14:25
Aso, ich verstehe. Vielen Dank. :)

Seite 1 von 1