[Clean Code] 오류 처리

해당 포스트는 Clean Code의 내용을 참고하여 작성되었습니다.

try-catch-finally 문 부터 작성하라

예외에서 프로그램 안에다 범위를 정의한다는 사실은 매우 흥미롭다. try-catch-finally 문에서 try 블록에 들어가는 코드를 실행하면 어느 시점에서든 실행이 중단된후 catch 블록으로 넘어갈 수 있다. 어떤 면에서 try 블록은 트랜잭션과 비슷하다. try 블록에서 무슨 일이 생기든지 catch 블록은 프로그램 상태를 일관성 있게 유지해야 한다. 그러므로 예외가 발생할 코드를 짤 때는 try-catch-finally 문으로 시작하는 편이 낫다.

그러면 try 블록에서 무슨 일이 생기든지 호출자가 기대하는 상태를 정의하기 쉬워진다.

unchecked 예외를 사용하라

checked 예외는 OCP를 위반한다. 매소드에서 checked 예외를 던졌는데 catch 블록이 세 단계 위에 있다면 그 사이 메소드 선언부를 전부 고쳐야 한다는 말이다. 모듈과 관련된 코드가 전혀 바뀌지 않았더라도 모듈은 다시 빌드한 다음 배포해야 한다는 말이다. 때로는 checked 예외도 유용하다. 아주 중요한 라이브러리를 작성한다면 모든 예외를 잡아야 한다.

하지만 일반적인 애플리케이션은 의존성이라는 비용이 이익보다 크다.

예외에 의미를 제공하라

예외를 던질 때는 전후 상황을 충분히 덧붙힌다. 그러면 오류가 발생한 원인과 위치를 찾기가 쉬워진다. 자바는 모든 예외에 호출 스택을 제공한다. 하지만 실패한 코드의 의도를 파악하려면 호출 스택만으로 부족하다.

오류 메세지에 정보를 담아 예외와 함께 던진다. 실패한 연산 이름과 실패 유형도 언급한다. 애플리케이션이 로깅 기능을 사용한다면 catch 블록에서 오류를 기록하도록 충분한 정보를 넘겨준다.

wrapper 클래스를 이용하라

외부 API를 사용할 때는 다양한 예외가 나온다. 이 때는 wrapping이 최선이다. 외부 API를 감싸면 외부 라이브러리와 프로그램 사이에서 의존성이 크게 줄어든다.

wrapper를 사용하면 특정 업체가 API를 설계한 방식에 발목 잡히지 않는다.

Author: Song Hayoung
Link: https://songhayoung.github.io/2020/08/04/Clean%20Code/clean-code7/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.