시스템아 미안해
Chapter 1: Safety - Item 6: Prefer standard errors to custom ones 본문
책/Effective Kotlin
Chapter 1: Safety - Item 6: Prefer standard errors to custom ones
if else 2026. 1. 22. 17:31예외는 예상하지 못한 상황을 나타내기 위해 사용됩니다.
예를 들어, JSON 형식을 파싱하는 라이브러리를 구현한다고 가정해 보겠습니다.
이때 제공된 JSON 파일이 올바른 형식을 갖고 있지 않다면,
JsonParsingException을 던지는 것은 충분히 합리적인 선택입니다.
kotlin
inline fun <reified T> String.readObject(): T {
//...
if (incorrectSign) {
throw JsonParsingException()
}
//...
return result
}
여기서는 표준 라이브러리에 적절한 예외가 없기 때문에,
이 상황을 나타내기 위해 커스텀 오류(custom error) 를 사용했습니다.
하지만 가능하다면, 직접 예외를 정의하기보다는 표준 라이브러리에서 제공하는 예외를 사용하는 것이 좋습니다.
이러한 예외들은 이미 많은 개발자들에게 익숙하며,
재사용되는 것이 전제된 계약(contract) 을 가지고 있기 때문입니다.
잘 알려진 요소들을 재사용하면, API를 배우고 이해하는 데 훨씬 수월해집니다.
다음은 자주 사용되는 대표적인 예외들입니다.
- IllegalArgumentException
메서드에 전달된 인자가 유효하지 않을 때를 나타냅니다.
보통 앞서 설명한 것처럼 require 또는 requireNotNull을 통해 발생시킵니다. - IllegalStateException
프로그램의 상태가 올바르지 않을 때를 나타냅니다.
예를 들어, 아직 초기화되지 않은 변수를 사용하려고 할 때 발생시킬 수 있습니다.
일반적으로 check, checkNotNull, 또는 error를 사용해 던집니다. - UnsupportedOperationException
해당 객체가 선언된 메서드를 지원하지 않을 때를 의미합니다.
이런 상황 자체는 가급적 피해야 하며,
메서드가 지원되지 않는다면 애초에 그 메서드는 클래스에 존재하지 않는 것이 바람직합니다.
보통 Kotlin 표준 라이브러리의 TODO 함수를 사용해 던지며,
이는 IntelliJ가 자동 생성한 코드에 기본으로 추가해 주기도 합니다. - IndexOutOfBoundsException
인덱스 값이 허용 범위를 벗어났을 때를 나타냅니다.
주로 컬렉션이나 배열에서 사용되며,
예를 들어 ArrayList.get(Int)에서 발생할 수 있습니다. - ConcurrentModificationException
동시 수정이 허용되지 않는 상황에서,
실제로 동시 수정이 감지되었을 때 발생합니다. - NoSuchElementException
요청한 요소가 존재하지 않을 때를 의미합니다.
예를 들어 Iterable을 구현한 경우,
더 이상 요소가 없는데 next를 호출하면 이 예외가 발생합니다.
이처럼 의미가 명확하고 널리 알려진 표준 예외를 적절히 사용하는 것은
코드의 의도를 분명히 하고, API의 이해도를 높이는 데 큰 도움이 됩니다.