스터디/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