Unreachable Catch Block과 kotlin exception의 중첩

rejs·2025년 12월 28일
exception IOException is never thrown in body of corresponding try statement

Checked Exception은 try문에서 throws하지 않는다면 컴파일러에서 catch하지 말라고 튕긴다

문제가 있다면 나는 지금 코틀린 sdk를 사용하고 있고, 코틀린은 checked Exception이 없다는 것이다.

그리고 코틀린 sdk에서는 예외를 Exception을 상속받는다.

따라서 PortOneException은 코틀린의 혜택을 받아서 sdk 내부에서 throws를 하지 않아도 되는 UnChecked Exception이 됨과 동시에! 자바 사용자 입장에선 평범하게 catch문으로 사용할 수 없는 Checked Exception이 되는 하이브리드 Exception이 되는 데 성공한 것이다 .

        }catch (Exception e) {
            // 1. 포트원 SDK 비즈니스 예외 계층 처리 (CancelPaymentException은 인터페이스이므로 instanceof 사용)
            if (e instanceof CancelPaymentException) {
                CancelPaymentException pe = (CancelPaymentException) e;

                // 케이스 A: 이미 취소된 경우 (성공으로 간주할 수 있는 상태)
                if (pe instanceof PaymentAlreadyCancelledException) {
                    throw new PaymentAlreadyCancelledException(
                            PortOnePaymentCancelExceptionCode.ALREADY_CANCELLED
                    );
                }

                // 케이스 B: 환불 불가 (데이터가 없거나, 결제 안 됐거나, 금액 오류 등 - FAILED 전이)
                if (pe instanceof PaymentNotFoundException ||
                        pe instanceof PaymentNotPaidException ||
                        pe instanceof CancelAmountExceedsCancellableAmountException) {

                    throw new PaymentCancelFailedException(
                            PortOnePaymentCancelExceptionCode.NOT_FOUND, pe.getMessage()
                    );
                }

                // 케이스 C: PG사 일시적 오류 (재시도 필요 - REQUIRED 유지)
                if (pe instanceof PgProviderException) {
                    throw new PaymentCancelRetryableException(
                            PortOnePaymentCancelExceptionCode.PG_PROVIDER_ERROR, pe.getMessage()
                    );
                }
            }

            // 2. 그 외 IO 에러, 네트워크 타임아웃, 알 수 없는 런타임 에러 (재시도 필요 - REQUIRED 유지)
            log.error("[portone.cancel.fail] 예상치 못한 시스템 에러 발생 paymentId={}", paymentId, e);
            throw new PaymentCancelRetryableException(
                    PortOnePaymentCancelExceptionCode.UNKNOWN_ERROR, e.getMessage()
            );
        }

이런식으로 일일히 instanceof를 사용하여 커스텀 런타임 예외로 감싸주어야한다

포트원 jvm 0.22.0 버전 sdk 문서 PortOneException

0개의 댓글