
백엔드
코드 품질 개선 기법 20편: 이례적인 예외 과대 포장
두줄요약
리소스 해제용 `use` 구현에서 블록 예외와 정리 예외가 동시에 날 수 있음을 다뤘습니다. 예외를 새로 감싸기보다 우선순위를 정하고 suppressed 예외를 활용하라고 제안했습니다.
핵심 내용
use같은 리소스 해제용 고차 함수에서, 블록 예외와 정리 과정 예외가 함께 발생할 수 있는 상황 정리- 예외를 별도 래퍼로 바꾸면 호출자의
catch가 기대대로 동작하지 않을 수 있다는 문제 제기 Throwable.addSuppressed로 보조 예외를 부가하고, 더 중요한 예외를 우선하는 방식 제안
주의할 점
- 정리용
dispose예외가 본 작업 예외를 덮어쓰지 않도록 우선순위 검토 필요 - 확인된 예외를
RuntimeException으로 감싸면 호출부의 예외 처리 흐름이 달라질 수 있음 - 부모-자식 관계의 예외를 여러 단계로 잡는 코드에서는 래핑 영향 점검 필요
적용해볼 점
- 리소스 해제 패턴 구현 시
close/dispose중 발생 가능한 예외까지 포함해 설계 - 예외 포장보다 억제 예외(suppressed exception) 활용 검토