ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AMDP 예외 처리 정리: SIGNAL, EXIT HANDLER, CX_AMDP_EXECUTION_ERROR
    SAP 2026. 7. 2. 21:59

    amdp-exception-handling.html
    0.01MB
    amdp-exception-handling.pdf
    0.12MB

     

     

    AMDP 예외 처리 정리: SIGNAL, EXIT HANDLER, CX_AMDP_EXECUTION_ERROR

    AMDP 예외 처리 정리: SIGNAL, EXIT HANDLER, CX_AMDP_EXECUTION_ERROR

    SAP S/4HANA On-Premise 환경에서 AMDP(SQLScript) 개발 시 예외를 어떻게 발생시키고 ABAP 쪽에서 어떻게 받을지 정리한 내용입니다.

    1. SIGNAL 문법

    AMDP는 HANA SQLScript 기반이라 SIGNAL 문법을 지원합니다. 사용자 정의 예외를 강제로 발생시킬 때 사용합니다.

    METHOD get_data BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT
      OPTIONS READ-ONLY
      USING zdemo_tab.
    
      IF :iv_key IS NULL THEN
        SIGNAL SQL_ERROR_CODE 10001
          SET MESSAGE_TEXT = 'Key value is missing';
      END IF;
    
      et_data = SELECT * FROM zdemo_tab WHERE key_field = :iv_key;
    
    ENDMETHOD.

    조건을 미리 선언(DECLARE ... CONDITION)해서 사용할 수도 있습니다.

    DECLARE lv_no_data CONDITION FOR SQL_ERROR_CODE 10002;
    
    IF :lt_result IS NOT INITIAL AND rows = 0 THEN
      SIGNAL lv_no_data SET MESSAGE_TEXT = 'No data found';
    END IF;
    ⚠️ SIGNAL은 TABLE FUNCTION에서는 제약이 있을 수 있습니다. TABLE FUNCTION은 순수 SELECT 결과 반환용이라 SIGNAL이 제한적으로 동작하는 경우가 있어, 예외 처리가 필요하면 PROCEDURE로 만드는 것을 권장합니다.

    2. ABAP에서 SIGNAL 예외 받기 (CX_AMDP_EXECUTION_ERROR)

    AMDP 안에서 SIGNAL로 발생시킨 예외는 ABAP 호출부에서 CX_AMDP_EXECUTION_ERROR로 캐치됩니다. SQL_ERROR_CODEMESSAGE_TEXT 값이 별도 필드로 오지는 않고, 예외 객체의 get_text( )를 통해 메시지 텍스트만 확인 가능합니다.

    TRY.
        zcl_amdp=>get_data(
          EXPORTING iv_key  = lv_key
          IMPORTING et_data = lt_data
        ).
      CATCH cx_amdp_execution_error INTO DATA(lx_amdp).
        DATA(lv_msg) = lx_amdp->get_text( ).
        " lv_msg 안에 SIGNAL에서 지정한 MESSAGE_TEXT 포함
    ENDTRY.

    3. CX_ROOT로 잡으면 안 되는 이유

    CX_AMDP_EXECUTION_ERROR는 결국 CX_ROOT의 하위 클래스라 CX_ROOT로 잡아도 동작은 하지만, 실무에서는 권장하지 않습니다.

    이유설명
    범위가 너무 넓음TRY 블록 안의 모든 예외를 다 삼켜버려 어떤 에러인지 구분이 안 됨
    AMDP 전용 정보 손실SIGNAL 메시지, DB 레벨 에러 텍스트 등 특화된 정보 접근 의미가 퇴색됨
    디버깅 어려움"AMDP 에러였다"라는 신호 자체가 로그에서 사라짐

    권장 패턴: 구체적 예외를 먼저 잡고, CX_ROOT는 최후의 안전망(fallback)으로 맨 뒤에 둡니다.

    TRY.
        zcl_amdp=>get_data(
          EXPORTING iv_key  = lv_key
          IMPORTING et_data = lt_data
        ).
    
      CATCH cx_amdp_execution_error INTO DATA(lx_amdp).
        " AMDP(SQLScript) 실행 중 발생한 에러 - SIGNAL 메시지 등
        DATA(lv_msg) = lx_amdp->get_text( ).
    
      CATCH cx_root INTO DATA(lx_root).
        " 그 외 예상 못한 에러 - 최후의 안전망
        DATA(lv_msg2) = lx_root->get_text( ).
    
    ENDTRY.

    4. EXIT HANDLER FOR SQLEXCEPTION

    SQLScript 내부에서 EXIT HANDLER FOR SQLEXCEPTION으로 예외를 이미 잡아 처리하면, 그 예외는 AMDP 밖으로 전파되지 않습니다. 이 경우 ABAP 쪽 TRY~CATCH는 필요 없고, procedure가 정상 종료되며 리턴하는 에러 코드/메시지 파라미터를 직접 체크하면 됩니다.

    METHOD get_data BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT
      OPTIONS READ-ONLY
      USING zdemo_tab.
    
      DECLARE lv_error_code TYPE i DEFAULT 0;
      DECLARE lv_error_msg  TYPE string DEFAULT '';
    
      DECLARE EXIT HANDLER FOR SQLEXCEPTION
      BEGIN
        lv_error_code = ::SQL_ERROR_CODE;
        lv_error_msg  = ::SQL_ERROR_MESSAGE;
        -- 여기서 exit 하므로 이후 로직 실행 안 됨
      END;
    
      et_data = SELECT * FROM zdemo_tab WHERE key_field = :iv_key;
    
      ev_error_code = :lv_error_code;
      ev_error_msg  = :lv_error_msg;
    
    ENDMETHOD.
    zcl_amdp=>get_data(
      EXPORTING iv_key        = lv_key
      IMPORTING et_data       = lt_data
                ev_error_code = lv_error_code
                ev_error_msg  = lv_error_msg
    ).
    
    IF lv_error_code <> 0.
      " 에러 처리 - TRY~CATCH 아니라 그냥 IF 체크
    ENDIF.

    비교: SIGNAL vs EXIT HANDLER

    구분SIGNALEXIT HANDLER FOR SQLEXCEPTION
    발생 주체개발자가 명시적으로 SIGNAL 호출DB 레벨 SQL 에러 자동 캐치
    ABAP 전파 여부예외로 전파됨 (CX_AMDP_EXECUTION_ERROR)전파 안 됨 (procedure 내부에서 종료)
    ABAP 수신 방식TRY~CATCH 필요리턴 파라미터 IF 체크로 충분
    적용 대상비즈니스 로직 검증 (예: 필수값 누락)DB 레벨 에러 (제약조건 위반 등)
    ⚠️ EXIT HANDLER는 해당 블록 안에서 발생한 SQLEXCEPTION만 커버합니다. 개발자가 직접 SIGNAL로 던진 사용자 정의 예외는 EXIT HANDLER로 잡히지 않고 그대로 AMDP 밖으로 나가 CX_AMDP_EXECUTION_ERROR가 됩니다. SIGNAL과 EXIT HANDLER를 함께 쓴다면 ABAP TRY~CATCH도 안전망으로 남겨둬야 합니다.
    💡 CONTINUE HANDLER도 있습니다. EXIT HANDLER는 에러 발생 시 블록을 즉시 빠져나가지만, CONTINUE HANDLER는 에러 발생 지점 다음 문장부터 계속 실행합니다. 상황에 맞게 선택하면 됩니다.

    5. 정리

    • DB 레벨 에러(SQLEXCEPTION)만 처리 + 리턴 파라미터 방식 → EXIT HANDLER만으로 충분, ABAP TRY~CATCH 불필요
    • 비즈니스 로직 검증까지 SIGNAL로 던진다면 → ABAP TRY~CATCH 필수 (CX_AMDP_EXECUTION_ERROR 우선 캐치)
    • 한 AMDP 안에서 두 방식을 섞어 쓰지 말고, 프로젝트/모듈 단위로 한 가지 방식으로 통일하는 것을 권장
    • CX_ROOT는 fallback 용도로만, 구체적 예외 클래스를 항상 먼저 캐치
    #ABAP #AMDP #SQLScript #SAP #S4HANA #예외처리 #SIGNAL #EXIT_HANDLER #CX_AMDP_EXECUTION_ERROR
Designed by Tistory.