본문 바로가기

ABAP

[ABAP] TRY 구문

장점. TRY 구문 사용 시 DUMP 방지 가능

 

TRY   = >> 예외가 발생할수 있는 부분

CATCH  =>> 예외가 발생하면 처리할 수 있는 부분

CLEANUP =>> 예외가 발행하면 변수 클리어

*----------------------------------------------------------------------*
  TRY.
      gs_header = gt_header_tmp[ 1 ].

      __select_config gs_config sy-sysid gs_header-bukrs. "매크로"

      IF sy-subrc NE 0.
        gv_code = 'N'.  " 오류메세지"
        gv_msg = TEXT-207.
      ENDIF.

    CATCH cx_sy_itab_line_not_found. "인터널테이블 라인이 없다면"
      gv_code = 'N'. " 오류메세지"
      gv_msg = TEXT-119.
  ENDTRY.
  
  
 *----------------------------------------------------------------------*
  DEFINE __select_config.

  CLEAR &1.

  SELECT SINGLE *
    INTO CORRESPONDING FIELDS OF @&1
    FROM DB_TABLE
   WHERE sysid = @&2
     AND bukrs = @&3.

END-OF-DEFINITION.

 

[F1]

예외를 처리할 수 있는 TRY 제어 구조의 CATCH 블록을 도입합니다.

CATCH 블록은 동일한 TRY 제어 구조의 TRY 블록에서 연결된 예외가 발생할 때마다 실행되는 프로그램 논리를 의미하는 예외 처리기입니다.

CATCH 블록은 CATCH 문 뒤에 지정된 예외 클래스 cx_class1 cx_class2 ...의 예외와 이러한 예외 클래스의 하위 클래스 예외를 처리합니다. TRY 제어 구조의 각 CATCH 문에서 임의의 수의 예외 클래스 cx_class1 cx_class2 ... 목록을 지정할 수 있으며, 보다 일반적인 예외 클래스(수퍼클래스)보다 더 구체적인 예외 클래스(서브클래스)를 지정해야 합니다. 이 순서는 CATCH 문 내에서 그리고 TRY 제어 구조의 여러 CATCH 문에서 모두 따라야 합니다.

CATCH 블록이 실행되기 전에 시스템은 기본적으로 예외가 발생한 컨텍스트를 삭제합니다. CATCH 블록을 실행하는 동안 컨텍스트를 얻으려면 BEFORE UNWIND 추가를 사용할 수 있습니다.

 

CATCH에서 일반 예외 클래스보다 먼저 특수 예외 클래스를 지정해야 한다는 규칙은 특수 처리기(서브 클래스)가 제공되는 경우 일반 예외 처리기(수퍼 클래스)에서 예외가 처리되지 않도록 합니다.

 

CATCH를 사용하여 두 가지 가능한 예외를 catch합니다. 입력을 숫자로 해석할 수 없는 경우 CX_SY_CONVERSION_NO_NUMBER 예외가 상위 클래스 CX_SY_CONVERSION_ERROR에 의해 catch됩니다. 숫자 0이 입력되면 CX_SY_CONVERSION_ERROR 예외가 상위 클래스 CX_SY_ARITHMETIC_ERROR에 의해 catch됩니다.

DATA(input) = `x`. 
cl_demo_input=>request( CHANGING field = input ). 

TRY. 
    cl_demo_output=>display( |{ 1 / CONV decfloat34( input ) }| ). 
  CATCH cx_sy_arithmetic_error cx_sy_conversion_error INTO DATA(exc). 
    cl_demo_output=>display( exc->get_text( ) ). 
ENDTRY.

 

 

도움말 예제코드

"화면 구성 "
DATA(in) = cl_demo_input=>new( ).
DATA: resumable     TYPE abap_bool VALUE abap_false,
      before_unwind TYPE abap_bool VALUE abap_false,
      resume        TYPE abap_bool VALUE abap_false.
in->add_field( EXPORTING as_checkbox = 'X'
                         text = 'RAISE RESUMABLE'
               CHANGING  field = resumable
 )->add_field( EXPORTING as_checkbox = 'X'
                         text = 'CATCH BEFORE UNWIND'
               CHANGING  field = before_unwind
 )->add_field( EXPORTING as_checkbox = 'X'
                         text = 'RESUME'
               CHANGING  field = resume
 )->request( ).
 

*---------------------------------------------------------------
*---------------------------------------------------------------
"클래스"
CLASS lcx_exception DEFINITION INHERITING FROM cx_static_check.
ENDCLASS.

CLASS exc_demo DEFINITION.
  PUBLIC SECTION.
    CLASS-DATA out TYPE REF TO if_demo_output.
    CLASS-METHODS: main,
      meth1 RAISING lcx_exception,
      meth2 RAISING RESUMABLE(lcx_exception).
ENDCLASS.

FIELD-SYMBOLS <fs> TYPE any.
*---------------------------------------------------------------
*---------------------------------------------------------------
CLASS exc_demo IMPLEMENTATION.
  METHOD main.
    out = cl_demo_output=>new( ).
    DATA exc TYPE REF TO lcx_exception.
    IF before_unwind = abap_false. " 2번째 라인이 공란이라면 "
      TRY.
          out->write( 'Trying method call' ). "해당 라인 표시"
          IF resumable = abap_false. " 1번째 라인이 공란이라면"
            exc_demo=>meth1( ).   "exc_demo 클래스의 METH1 METHOD 호출"
          ELSEIF resumable = abap_true. " 1번 라인이 체크되면"
            exc_demo=>meth2( ). "exc_demo 클래스의 METH2 METHOD 호출"
          ENDIF.
        CATCH lcx_exception.
          IF <fs> IS ASSIGNED.
            out->write( 'Context of method available' ).
          ELSE.
            out->write( 'Context of method not available' ).
          ENDIF.
      ENDTRY.
      out->write( 'Continue after main TRY block' ).
    ELSEIF before_unwind = abap_true. " 2번째라인 체크 시"
      TRY.
          out->write( 'Trying method call' ).
          IF resumable = abap_false. 
            exc_demo=>meth1( ).
          ELSEIF resumable = abap_true. " 1번째라인 체크 시"
            exc_demo=>meth2( ).
          ENDIF.
        CATCH BEFORE UNWIND lcx_exception INTO exc.
          IF <fs> IS ASSIGNED.
            out->write( 'Context of method available' ).
          ELSE.
            out->write( 'Context of method not available' ).
          ENDIF.
          IF resume = abap_true.
            IF exc->is_resumable = abap_true.
              RESUME.
            ELSE.
              out->write( 'Resumption not possible' ).
            ENDIF.
          ENDIF.
      ENDTRY.
      out->write( 'Continue after main TRY block' ).
    ENDIF.
    out->display( ).
  ENDMETHOD.
*---------------------------------------------------------------
*---------------------------------------------------------------
  METHOD meth1.
    DATA loc TYPE i.
    ASSIGN loc TO <fs>.
    TRY.
        out->write( 'Raising non-resumable exception' ).
        RAISE EXCEPTION TYPE lcx_exception.
        out->write( 'Never executed' ).
      CLEANUP.
        out->write( 'Cleanup in method' ).
    ENDTRY.
    out->write( 'Continue after TRY block in method' ).
  ENDMETHOD.
*---------------------------------------------------------------
*---------------------------------------------------------------  
  METHOD meth2.
    DATA loc TYPE i.
    ASSIGN loc TO <fs>.
    TRY.
        out->write( 'Raising resumable exception' ).
        RAISE RESUMABLE EXCEPTION TYPE lcx_exception.
        out->write( 'Resuming method' ).
      CLEANUP.
        out->write( 'Cleanup in method' ).
    ENDTRY.
    out->write( 'Continue after TRY block in method' ).
  ENDMETHOD.
ENDCLASS.
*---------------------------------------------------------------
*---------------------------------------------------------------
START-OF-SELECTION.
  exc_demo=>main( ).

[실행화면]

[설명]

메서드 meth1은 재개할 수 없는 예외를 발생시키고 메서드 meth2는 CATCH를 사용하여 기본 메서드의 TRY 제어 구조에서 처리되는 재개 가능한 예외를 발생시킵니다.
◾BEFORE UNWIND 없이 처리하면 처리 전 두 경우 모두 CLEANUP 블록이 실행되고 처리 중 호출된 메서드의 컨텍스트가 존재하지 않습니다.
◾BEFORE UNWIND로 처리하면 처리 중 두 경우 모두 호출된 메서드의 컨텍스트가 존재하고 처리 후에 CLEANUP 블록이 실행됩니다.
◾재개 가능한 예외가 발생하면 처리 중에 RESUME 문을 실행할 수 있으므로 CLEANUP 블록이 실행되지 않고 호출된 메서드의 처리가 계속됩니다.

 

 

CLASS lcx_exception DEFINITION INHERITING FROM cx_static_check.
ENDCLASS.

INHERITING FROM :  슈퍼클래스, 상속관계를 정의할 수 있다.  NODE 트리 개념 처럼 가장 상위의 SUPER CLASS와 그에 속한 상속받는(INHERITING) CLASS의 관계를 지정한다. 

'ABAP' 카테고리의 다른 글

ABAP 펑션 CONVERSION_EXIT  (0) 2023.01.17
[ABAP] 텍스트 필드 대소문자 구분  (0) 2022.10.04
ABAP 에서 웹딘 (WD4A) 호출  (0) 2022.09.16
[ABAP] VALUE # 구문  (0) 2022.08.31
SAP HTML을 이용한 E-MAIL 본문 이미지 추가  (0) 2022.08.05