외부 라이브러리(AWS SDK 등)의 예외를 catch로 잡으려면, 먼저 예외 계층 구조를 알아야 한다. 어떤 예외가 어떤 예외의 하위인지 모르면 catch를 제대로 구성할 수 없다. 확인하는 방법 3가지를 정리한다.
IntelliJ - Class Hierarchy (가장 빠른 방법)
클래스명 우클릭 → Open in → Class hierarchy
전체 상속 트리를 한눈에 볼 수 있다.
SdkException
├── SdkClientException — 네트워크, 타임아웃 등
└── SdkServiceException
└── S3Exception — S3 서버 측 오류
├── NoSuchKeyException
├── InvalidRequestException
├── TooManyPartsException
└── ...
IntelliJ - 클래스 소스 직접 확인
클래스명 위에 커서 놓고 Ctrl+B (또는 클릭) → 소스로 이동한다.
소스 첫 줄의 extends에서 부모가 바로 보인다.
public class InvalidRequestException extends S3Exception { // ← 여기
공식 문서
각 클래스 페이지의 클래스 정의 부분에 extends가 명시되어 있다.
- AWS SDK v2 S3Client API: https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Client.html
- 각 메서드 페이지의
Throws:섹션에서 던질 수 있는 예외 목록을 확인할 수 있다
catch에서 활용하는 방법
계층을 파악하면, 하위 예외를 하나씩 잡을 필요 없이 부모로 잡을 수 있다.
// ❌ 하위 예외를 하나씩 잡는 경우
} catch (InvalidRequestException e) {
} catch (TooManyPartsException e) {
} catch (NoSuchKeyException e) {
// ...
// ✅ 부모로 잡으면 하위 전부 포함
} catch (S3Exception e) { // S3 서버 측 오류 전부
} catch (SdkClientException e) { // 클라이언트 측 오류 전부
}
AWS SDK v2 예외 계층 참고
SdkException
├── SdkClientException
│ └── 네트워크 오류, 타임아웃, 설정 오류 등
└── SdkServiceException
└── AwsServiceException
└── S3Exception
├── NoSuchKeyException — 파일 없음
├── NoSuchBucketException — 버킷 없음
├── AccessDeniedException — 권한 없음
├── InvalidRequestException — 잘못된 요청
├── TooManyPartsException — Multipart 파트 초과
└── ...