[CLEAN CODE] 오류 처리

rami·2021년 7월 1일
0

clean-code

목록 보기
7/15
post-thumbnail

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

논리와 오류 처리 코드가 뒤섞이지 않도록 오류가 발생하면 예외를 던지는 편이 낫다.

Try-Catch-Finally 문부터 작성하라

예외가 발생할 코드를 짤 때는 try-catch-finally문으로 시작하는 편이 낫다.
try문은 transaction과 비슷하다.

미확인 예외를 사용하라

확인된 예외를 사용하면 최하위 단계에서 최상위 단계까지 연쇄적 수정이 일어나서 캡슐화가 깨진다.

예외에 의미를 제공하라

예외를 던질 때 전후 상황을 충분히 덧붙여야 오류가 발생한 원인과 위치를 찾기 쉽다.

  • 오류 메시지에 '실패한 연산 이름', '실패 유형' 제공
  • 로깅 기능 사용

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

예외를 정의해 감싸는 클래스(wrapper class)를 만들자.

정상 흐름을 정의하라

외부 API를 감싸 독자적인 예외를 던지고, 코드 위에 처리기를 정의해 중단된 계산을 처리하는 것은 멋진 처리 방식이지만, 때로는 중단이 적합하지 않은 때도 있다.

특수 사례 패턴(SPECIAL CASE PARTTERN)

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

null을 반환하지 마라

// BAD CODE
public void registerItem(Item item) { 
  if (item != null) {
    ItemRegistry registry = peristentStore.getItemRegistry();
    if (registry != null) {
      Item existing = registry.getItem(item.getID());
      if (existing.getBillingPeriod().hasRetailOwner()) {
        existing.register(item);
      }
    }
  }
}
  • null을 반환하는 코드는 일거리를 늘릴 뿐만 아니라 호출자에게 문제를 떠넘긴다.
  • 메서드에서 null을 반환하고픈 유혹이 든다면 예외를 던지거나 특수 사례 객체를 반환해라.
  List<Employee> employees = getEmployees();
  for(Employee e : employees) {
    totalPay += e.getPay();
  }

  public List<Employee> getEmployees() {
    if( .. there are no employees .. )
      return Collections.emptyList();
    }
  }
  • getEmployees()를 변경해 빈 리스트를 반환한다면 코드가 훨씬 깔끔해지고 NullPointerException이 발생할 가능성도 줄어든다.

null을 전달하지 마라

  • 정상적인 인수로 null을 기대하는 API가 아니라면 메서드로 null을 전달하는 코드는 최대한 피한다.

결론

깨끗한 코드는 읽기도 좋아야 하지만 안정성도 높아야 한다.
오류 처리를 논리와 분리하면 독립적인 추론이 가능해지며 코드 유지보수성도 크게 높아진다.

profile
Developer

0개의 댓글