논리와 오류 처리 코드가 뒤섞이지 않도록 오류가 발생하면 예외를 던지는 편이 낫다.
예외가 발생할 코드를 짤 때는 try-catch-finally문으로 시작하는 편이 낫다.
try문은 transaction과 비슷하다.
확인된 예외를 사용하면 최하위 단계에서 최상위 단계까지 연쇄적 수정이 일어나서 캡슐화가 깨진다.
예외를 던질 때 전후 상황을 충분히 덧붙여야 오류가 발생한 원인과 위치를 찾기 쉽다.
예외를 정의해 감싸는 클래스(wrapper class)를 만들자.
외부 API를 감싸 독자적인 예외를 던지고, 코드 위에 처리기를 정의해 중단된 계산을 처리하는 것은 멋진 처리 방식이지만, 때로는 중단이 적합하지 않은 때도 있다.
특수 사례 패턴(SPECIAL CASE PARTTERN)
// 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);
}
}
}
}
List<Employee> employees = getEmployees();
for(Employee e : employees) {
totalPay += e.getPay();
}
public List<Employee> getEmployees() {
if( .. there are no employees .. )
return Collections.emptyList();
}
}
깨끗한 코드는 읽기도 좋아야 하지만 안정성도 높아야 한다.
오류 처리를 논리와 분리하면 독립적인 추론이 가능해지며 코드 유지보수성도 크게 높아진다.