스터디/CleanCode

[CleanCode] Chapter07 오류처리

냠냠쿠 2023. 12. 11. 07:56
728x90

📖 책 내용 정리

🔶 7장 오류처리

1️⃣ 오류코드보다 예외를 사용하라

  • 뭔가 잘못될 가능성은 늘 존재한다. 뭔가 잘못되면 바로 잡을 책임은 프로그래머에게 있다.
  • if else 문을 통해 오류 코드를 반환하면 호출자 코드가 복잡해진다.
    → 함수는 호출한 즉시 오류를 확인해야 하기 때문에 오류가 발생하면 예외를 던지는 편이 좋다.
    예외를 사용하게 되면 호출자 코드가 논리 오류 처리 코드와 섞이지 않아 깔끔해진다.

 

2️⃣ Try-Catch-Finally 문 부터 작성하라

  • try 블록에서 어떤 일이 생기든 catch 블록은 프로그램 상태를 일관성 있게 유지해야한다.
    그러므로 예외가 발생할 코드를 짤 때에는 try-catch-finally 문으로 시작하는 편이 좋다.
    → try 블록에서 어떤 일이 생기든 호출자가 기대하는 상태를 정의하기 쉬워짐
  • 강제로 예외를 일으키는 테스트케이스를 작성 한 후 테스트를 통과하게 코드를 작성하면 try 블록의 트랜잭션 범위를 구현하게되어 본질을 유지하기 쉬워짐

 

3️⃣ 미확인 예외를 사용하라

  • 확인된 예외는 OCP (Open closed Principle)을 위반한다.
    즉, 하위 단계에서 코드를 변경하면 상위 단계 메서드 선언부를 모두 고쳐야 하기 때문에 모듈과 관련된 코드가 전혀 바뀌지 않았더라도 모듈을 다시 빌드 한 다음 배포해야 한다.
  • 확인된 오류를 던진다면 함수는 선언부에 throws 절을 추가해야한다.
    그러면 변경한 함수를 모두 호출하는 함수 모두가
    1) catch 블록에서 새로운 예외를 처리하거나
    2) 선언부에 throws 절을 추가해야함
    → 캡슐화도 깨짐

 

4️⃣ 예외에 의미를 제공하라

  • 예외를 던질 때 전후 상황을 충분히 덧붙이고 오류메세지에 정보를 담아 예외와 함께 던진다.

 

5️⃣ 호출자를 고려해 예외 클래스를 정의하라

  • 오류를 정의할 때 프로그래머에게 가장 중요한 관심사는 오류를 잡아내는 방법이 되어야한다.
  • 외부 API를 사용할 떄에는 감싸기 기법이 최선이다.
    → 외부 라이브러리와 프로그램 사이에서 의존성이 크게 줄어든다.
  • 한 예외는 잡아내고 다른 예외는 무시해도 괜찮은 경우라면 여러 예외 클래스를 사용한다.

 

6️⃣정상 흐름을 정의하라

  • 클래스를 만들거나 객체를 조작해 특수사례를 처리하는 방식으로 하면 클라이언트 코드가 예외적 상황을 처리할 필요가 없어진다.

 

7️⃣ null을 반환하지마라

  • null을 반환하는 대신 예외를 던지거나 특수 사례 객체를 반환한다.
  • null을 반환하는 대신 빈 리스트를 반환해도 된다.

 

8️⃣ null을 전달하지마라

  • InvalidArgumentException 예외의 경우 assert문을 사용하면 좋다.
  • 애초에 null을 넘기지 못하도록 하는 것이 좋다.
public class Employee {
    public string department (string name, string number){
        assert name != null : "name is null";
        assert number != null : "number is null";
        ...
    }

}

 

9️⃣ 결론

  • 깨끗한 코드는 읽기도 좋아햐 하지만 안정성도 높아야 한다.

 

💌 책에서 기억하고 싶은 내용

깨끗한 코드는 읽기도 좋아햐 하지만 안정성도 높아야 한다.

애초에 null을 넘기지 못하도록 하는 것이 좋다

뭔가 잘못될 가능성은 늘 존재한다. 뭔가 잘못되면 바로 잡을 책임은 프로그래머에게 있다.

 

💬 소감

try catch 문이 프로젝트 할 때에는 사용을 잘 못해봤었는데, 실무에서는 if문 만큼 자주 쓰이더란다...
그럼에도 무분별하게 try-catch문을 남발 했던것 같기도 하고, try-catdh문을 어떻게 적절하게 써야하는가에 대해서 항상 고민이 많았는데,
강제로 예외를 일으키는 코드를 작성하고 테스트를 통과하도록 작성해 보라는 가이드를 주었으니, 한번 도전해봐야겠다는 생각이 들었다.

null은 항상 난제다! 업무를 하면서도 if( name != null ) 과 같은 형태의 코드를 많이 봐왔고, 나 또한 프로젝트를 진행 할 때 그렇게 많이 썼었다.
이를 특수 사례 객체로 빼 내는 방법을 처음 알게 되었는데 신선한 충격이었다.
제일 좋은 것은 null을 전달하거나 반환하지 않는 것이 제일 좋지만 말이다.

 

💥 이해 안 가는 부분

  • 이해가 안가는 것은 아니지만, 특수 사례 객체와 assert문에 대해서 추가로 공부 할 예정이다.
728x90