-
AMDP 예외 처리 정리: SIGNAL, EXIT HANDLER, CX_AMDP_EXECUTION_ERRORSAP 2026. 7. 2. 21:59amdp-exception-handling.html0.01MBamdp-exception-handling.pdf0.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_CODE나MESSAGE_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
구분 SIGNAL EXIT 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 용도로만, 구체적 예외 클래스를 항상 먼저 캐치
'SAP' 카테고리의 다른 글
AMDP에서 HANA 서버 타임존(UTC/KST) 확인하는 방법 (0) 2026.07.08 대용량 itab 처리와 바이너리 직렬화/압축 정리 (0) 2026.07.08 AMDP OPTIONS CDS SESSION CLIENT CURRENT - MANDT 처리 정리 (0) 2026.06.23 HANA Sequence & NEXTVAL — Oracle → AMDP 변환 정리 (0) 2026.06.18 AMDP 동적 JSON 파라미터 (0) 2026.06.17