ABAP 예외와 런타임 오류 정리: CX_STATIC_CHECK, TRY, ASSERT
3줄 요약
현대 ABAP 의 예외는 클래스 기반이고, 세 상위 클래스(
CX_STATIC_CHECK,CX_DYNAMIC_CHECK,CX_NO_CHECK) 중 하나의 하위 클래스예요. 어느 쪽이냐에 따라 호출자가 처리해야 하는 정도가 달라져요.예외는
RAISE EXCEPTION(또는COND/SWITCH의THROW)으로 일으키고TRY ... CATCH ... ENDTRY로 잡아요. 잡지 않으면 런타임 오류(덤프)가 나요.ASSERT가 거짓이면 잡을 수 없는 예외로 프로그램이 종료돼요(ASSERTION_FAILED).
어떤 상황에서 쓰나요
1 / 0 처럼 실행 중에 문제가 생겼을 때 프로그램이 덤프로 끝나게 둘지 처리할지, 내 메서드에서 오류를 어떻게 알릴지 정해야 해요. Clean ABAP 연재 9회가 "어떤 예외를 언제 쓰나"의 기준이라면, 이 글은 치트시트의 *Exceptions and Runtime Errors* 편을 따라 문법과 동작을 정리해요.
핵심 내용
예외 클래스
예외 클래스는
CX_로 시작하는 이름이 관례예요(CX_SY_ZERODIVIDE). 직접 만드는 예외는 전역이면ZCX_/YCX_, 로컬이면LCX_가 관례예요.모든 예외 클래스는
CX_ROOT의 하위인 세 추상 클래스 중 하나에서 파생돼요.CX_ROOT에서 직접 파생할 수는 없어요.메서드 시그니처에
RAISING cx_...로 선언해 호출자가 어떤 예외를 예상해야 하는지 알려요.클래스 기반이 아닌 옛 예외(
EXCEPTIONS로 받는 방식)는 폐기 예정이라 새 개발에서는 쓰지 말라고 해요.예외 객체에서 얻을 수 있는 것:
get_text( )(예외 텍스트),get_source_position( )(프로그램, 인클루드, 줄 번호), 속성textid,previous(이전 예외 참조),is_resumable. 사용자 정의 속성은READ-ONLY로 정의하라고 해요.
세 가지 범주
CX_STATIC_CHECK: 사용자가 반드시 처리해야 해요. 호출한 쪽이TRY로 잡거나 자기 시그니처에 선언해 전파하지 않으면 컴파일 때 경고가 나요.CX_DYNAMIC_CHECK: 사전 점검으로 피할 수 있는 예외예요. 컴파일 때는 강제하지 않고, 실제로 일어났는데 처리도 선언도 없으면 그때CX_SY_NO_HANDLER가 일어나고previous가 원래 예외를 가리켜요. 예:CX_SY_ZERODIVIDE는CX_SY_ARITHMETIC_ERROR를 거쳐CX_DYNAMIC_CHECK에서 파생돼요.CX_NO_CHECK: 언제든 일어날 수 있고 지역에서 의미 있게 처리할 수 없는 오류(메모리 부족 등)예요. 모든 프로시저 시그니처에 암묵적으로 선언된 것으로 봐요.기본 규칙은 알맞은 범주를 고르는 것이에요(치트시트는 ABAP 프로그래밍 지침의 해당 항목을 안내해요).
예외 일으키기
RAISE EXCEPTION TYPE cx_...,RAISE EXCEPTION exc(이미 만든 객체),RAISE EXCEPTION NEW cx_...( ), 동적 생성(CREATE OBJECT dyn_exc TYPE ('CX_...')). 추상 클래스(cx_static_check등)는 인스턴스를 만들 수 없어요.연산자 안에서는
COND와SWITCH의ELSE THROW cx_...( ).
예외 잡기 (`TRY`)
TRY. ... CATCH cx_... ... ENDTRY.CATCH가 없으면 문법 경고가 나요.한
CATCH에 여러 클래스를 나열하거나CATCH블록을 여러 개 둘 수 있고, 상속 관계에 있으면 더 구체적인 예외를 먼저 써야 해요.상위 클래스를 지정하면 하위 클래스 예외도 잡혀요(
cx_sy_arithmetic_error로cx_sy_zerodivide를 잡음).CATCH cx_root로 모든 예외를 잡을 수 있지만, 어떤 예외를 예상하는지 드러나도록 구체적인 클래스를 쓰길 권해요.
런타임 오류
처리되지 않은 잡을 수 있는 예외, 잡을 수 없는 예외, 프로그램이 일으킨 오류, 실패한 단언이 원인이에요. 이름으로 구분하고(예:
COMPUTE_INT_ZERODIVIDE), 데이터베이스 롤백이 일어나며 짧은 덤프가 생성돼요. ADT 에서는 팝업에서 *Show* 로 덤프를 보고, Feed Reader 탭에서도 확인할 수 있어요.일부러 덤프를 내려면
RAISE SHORTDUMP TYPE cx_...나THROW SHORTDUMP를 써요(Clean ABAP 연재 9회에서 말한 "회복 불가 상황은 덤프"의 문법).ASSERT 논리식.이 거짓이면 잡을 수 없는 예외로 프로그램이 끝나요(ASSERTION_FAILED).
TRY.
DATA(div) = 1 / 0.
CATCH cx_sy_arithmetic_error INTO DATA(exc).
DATA(text) = exc->get_text( ).
ENDTRY.주의할 점
치트시트는 예외 범주 선택의 기준(어느 쪽이 맞는지)을 ABAP 프로그래밍 지침에 맡기고 있어요. Clean ABAP 연재 9회에서 본 것처럼 가이드마다 선호가 달라서, 팀 기준을 먼저 정하세요.
치트시트의 예제는
DATA(div) = 1 / 0.같은 일부러 오류를 내는 코드를 포함해요. 이 글에서도 설명용이고 실제로 실행해 보지는 않았어요.치트시트는 계속 갱신되는 문서예요. 이 편의 첫 공개는 2024년 11월이고, 제가 읽은 판은 2026년 10월 기준이에요. 이 글은 읽고 정리한 것이에요.
원문 주소: https://github.com/SAP-samples/abap-cheat-sheets/blob/main/27_Exceptions.md
출처와 이용 안내
원문: ABAP Cheat Sheets - Exceptions and Runtime Errors · 작성자 SAP SE and contributors SAP-samples · 작성일 2024-11-04 · 기준 릴리스에 따라 다름 원문은 최신 ABAP 기준 · 확인일 2026-10-25
이 글은 위 원문을 읽고 한국어로 요약·재구성한 글이며 번역본이 아니에요. 원문의 저작권은 작성자와 SAP에 있어요.
원문은 Apache-2.0 라이선스(https://www.apache.org/licenses/LICENSE-2.0)로 공개된 자료예요. 이 글은 내용을 한국어로 줄이고 순서를 바꾼 변경본이며, 원저작자가 이 글을 보증하지 않아요.
설정과 화면은 릴리스마다 달라요. 적용하기 전에 원문과 SAP Help Portal, 관련 SAP Note에서 최신 내용을 확인해 주세요.
SAP와 SAP 제품명은 SAP SE의 상표예요. 바로투입은 SAP와 관련이 없어요.
댓글 0
아직 댓글이 없어요.
로그인하고 댓글 쓰기