- 오류처리는 깨끗한 코드와 연관성이 있다.
- 하지만 오류처리로 인해 프로그램 논리를 이해하기 어려워 진다면 깨끗한 코드라 부르기 어렵다.
-
오류 코드보다 예외를 사용하라.
- 함수를 호출 하는 즉시 오류 를 확인하고 처리해야하기 때문에 복잡한다.
- 그래서 그냥 예외를 던지면 편하다.
- 코드도 깔끔해지고 로직을 이해하기가 더 쉬워진다.
-
Try- Catch - Finally 문 부터 작성하라.
- try-catch 문은 트랜잭션과 유사하다.
- 예외가 발생할 코드를 짤때는 try catch 문 부터 작성하자.
- 미확인 ( Unchecked ) 예외를 사용하라.
-
확인된 예외는 OCP를 위반한다.
- 확인된 예외를 던졌는데 catch 블록이 세 단계 위에 있다면 그 사이 메소드 모두가 선언부에 해당 예외를 정의해야 한다.
- 즉 하위 단계에서 코드를 변경하면 상위 단계 메서드 선언부를 전부 고쳐야 한다는 말이다.
-
최상위 함수에서 점점 아래함수를 호출하여 최하위 함수에서 새로운 오류를 던진다고 했을떄
-
확인된 오류를 던진다면 최하위 함수를 거쳐온 모든 함수들을 수정해야 한다. ( throws 절을 추가 하거나 catch 블록에서 예외처리 )
-
그리고 모든 함수가 최하위 함수가 던지는 예외를 알아야 하므로 캡슐화가 깨진다.
-
아주 중요한 라이브러리를 작성한다면 모든 예외를 잡아야 한다.
-
하지만 일반적인 애플리케이션은 의존성이라는 비용이 이익보다 크다.
- 예외에 의미를 제공해라.
- 오류메세지에 정보를 담아 예외와 함께 던지면 발생한 원인과 위치를 찾기가 쉬워진다.
- 로깅도 사용한다면 catch 블록에서 오류를 기록하도록 충분한 정보를 넘겨준다.
- 호출자를 고려해 예외 클래스를 정의하라.
-
애플리케이션에서 오류를 정의할때 프로그래머에게 가장 중요한 관심사는
-
오류를 잡아내는 방법 이 되어야 한다.
-
외부 api를 사용할때 wrapper 클래스를 하나 만들어서 예외 처리하는 것은 좋은 방법이다.
-
외부 api를 감싸면 외부 라이브러리와 프로그램 사이에 의존성이 크게 줄어든다.
-
갈아끼우는것도 쉽다. wrapper 클래스에서 수정하면 되기 떄문.
-
( wrapper 클래스 작성하는 비용이면 그냥 wrapper 클래스 안쓰고 class에 쓰면 되지않나 ? )
-
( 의존성이 줄어든다는 장점때문에 wrapper를 사용하는것 같다 )
-
흔히 예외 클래스가 하나만 있어도 충분한 코드가 많다.
-
예외 클래스에 포함 된 정보로 오류를 구분해도 괜찮은 경우가 그렇다.
-
한 예외는 잡아내고 다른 예외는 무시해도 괜찮은 경우라면 여러 예외 클래스를 사용한다.
-
( 이 3문단이 이해가 안된다. )
- 정상 흐름을 정의하라.
-
비즈니스와 오류처리가 잘 분리되면 코드가 대부분이 깨끗하고 간결하게 보인다.
-
하지만 그러다보면 점점 오류처리가 저 멀리 떨어져 나가게된다
-
굳이 예외처리를 안하는 상황이 있다.
-
이를 특수사례 패턴이라 부른다.
-
클래스를 만들거나 객체를 조작해 특수사례를 처리하는 방식이다.
-
그러면 클라이언트 코드가 예외적인 상황을 처리할 필요가 없어진다.
-
클래스나 객체가 예외적인 상황을 캡슐화해서 처리하므로.
-
( 굳이 예외처리가 코드를 복잡하게 만든다면 Martin Fowler의 Special Case Pattern을 사용하자.(참조 3) )
- null을 반환하지 마라.
- null을 반환하는 코드는 호출자에게 일거리를 늘려주는일이다.
- null대신에 특수사례 객체를 반환하자.
- 사용하려는 외부 API가 null을 반환한다면 wrapper method를 구현해 예외를 던지거나
- 특수사례 객체를 반환하는 방식을 고려한다.
- 많은 경우에 특수사례 객체가 손수윈 해결책이다.
- null을 전달하지 마라.
- 정상적인 인수로 null을 기대하는 API가 아니라면 메서드로 null을 전달하는 코드는 최대한 피한다.
- assert문을 사용해서 null체크 하는것도 괜찮은 방법이다.
- ( 신기하다 다시보자 )
결론
- 깨끗한 코드는 읽기도 좋아야 하지만 안전성도 높아야 한다.
'book > 클린코드' 카테고리의 다른 글
9장 - 단위 테스트 (0) | 2020.12.02 |
---|---|
8장 - 경계 (0) | 2020.11.30 |
6장 - 객체와 자료구조 (0) | 2020.11.25 |
5장 - 형식 맞추기 (0) | 2020.11.23 |
4장 - 주석 (0) | 2020.11.22 |