07. 에러 처리

오류 처리 코드로 인해 논리가 이해하기 어려워진다면 깨끗한 코드라 부르기 어렵다.

오류를 처리하는 기법과 고려사항 몇 가지 소개

오류코드보단 예외 사용#

  • 오류코드는 호출자 코드가 복잡해짐
  • 예외를 사용하면 메인 로직과 오류 처리가 분리되어 코드 품질이 좋아짐

try-catch-finally 문부터 작성#

  • 예외가 발생할 코드에선 try-catch-finally 로 구성
  • TDD, 먼저 강제로 예외를 일으키는 TC를 작성한 후 테스트를 통과하게 코드를 작성하는 방법을 권장

미확인(unchecked) 예외를 사용#

  • 확인된 예외는 수정이 발생한 상위 클래스들의 수정을 유발하므로 OCP 를 위반한 것!

예외에 의미 제공#

  • 예외 정의 시, 오류 메시지 함께 정의

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

  • 오류 정의의 최대 관심사는 오류를 잡아내는 방법
  • Wrapper 클래스로 외부 api를 호출하는 부분을 감싸 구현
    • 구현할 프로그램에 더 적합한 방식으로 감쌀 수 있음
    • 외부라이브러리와 프로그램 상이 의존성이 줄어듦
    • 테스트 용이

정상 흐름 정의#

특수 사례 패턴으로 정상흐름 재정의#

패턴 적용 전

try {
MealExpenses expenses = expenseReportDAO.getMeals(employee.getID());
total += expenses.getTotal();
} catch ( MealExpensesNotFound e ) {
total += getMealPerDiem();
}

특수 사례 패턴 적용 후

// business logic
MealExpenses expenses = expenseReportDAO.getMeals(employee.getId())l
total += expenses.getTotal()
// in ExpenseReportDAO
public MealExpenses getMeals(Long employeeId) {
...
if (... 식비를 비용으로 청구하지 않았다면 ...) {
return new PerDiemMealExpenses();
}
}
// sepecial case class
public class PeriDiemMealExpenses implements MealExpenses {
public int getTotal() {
return 기본 식비;
}
}

null#

  • null 반환 X
    • null 반환 보단 예외을 발생시키거나, 특수사례 객체를 반환
    • 빈 리스트를 반환할 경우, Collections.emptyList() 반환
  • null 파라미터 전달 X

결론#

오류처리와 프로그램 논리를 분리해 따로따로 구현한다면 튼튼하고 깨끗한 코드를 작성할 수 있다

Last updated on