자바에서는 두가지 익셉션 부류를 나눌 수 있다.
1. CheckedException
2. UnCheckedException
CheckedException 은 예외처리를 보장받아야한다.
try catch, throws 등으로 처리해야하며, 처리하지 않을 경우 컴파일러가 에러를 잡아준다.
Exception, Throwable, 스프링의 BindException 이 대표적인 예이다.
UnCheckedException 은 예외처리가 보장되지 않는다.
IllegalArgumentException, NullPointerException, Error 등이 대표적인 예이다.
코틀린과 연관한 대부분의 라이브러리는 자바로 구현되어 있으므로, 코틀린과 혼합 사용 시 위의 점을 고려하지 않으면 의도하지 않은 결과를 볼 수 있다.
예를 들어 트랜젝션 매니저 등의 스프링 라이브러리는 처리가 정의되지 않은 CheckedException 에 대해 UndeclaredThrowableException 으로 감싸 UnCheckedException 으로 반환하므로, 트랜젝션에 들어가기 전 try catch 를 정의했다면 그 예외처리에서의 처리가 의도하지 않은 방향으로 흘러갈 수 있다.
사족으로, 롤백을 판단하는 타이밍 또한 달라지는 등, 그 처리가 일반적인 상황과 달라진다.
예를 한가지 더 들자면, ControllerAdvise 등의 aop 에서 해당 예외를 캐치하지 못한다. - boot 2.2.13 기준
사족으로, @Retry 의 경우 cause 를 트레이싱하므로, 의도한대로 동작했다고 착각할 수 있다.
또한 몇몇의 라이브러리가 이러한 자바의 특성을 전제하여 reflection 간에 throws 키워드로 정의한 CheckedException 들에 대해 처리하고 있다. (즉, declaredException 을 보고 무언가 처리하고 있을 수 있다.) 관련한 에러에 대해 이 점이 디버깅에 있어 사소한 힌트가 될 수 있다.
'개발공부 > 주저리' 카테고리의 다른 글
K8S 컨테이너 런타임에 대한 잡지식 (1) | 2024.09.12 |
---|---|
모름을 모른다는 것 (1) | 2024.04.10 |
Enter passpharase for key: 매번 입력하지 않도록 설정하기 (0) | 2024.04.07 |
코드를 어떻게 비판하나 (0) | 2021.10.20 |
RSA 복호 캡슐화 아이디어 (0) | 2021.08.18 |