컴파일이 아닌 런타임 시점에 예외를 확인한다. 따라서 catch를 하지 않는다
예외를 throws할 필요가 없지만, 해도 무방하다
그렇다면 두 예외를 왜 나눠 놨을까?
-> 그러나 이 역시 기준이 모호하다. 요즘 나오는 언어들은 checked exception을 없애고 있다.
-> 결국은 처리하는 쪽에 달려있다는게 힌트라고 한다. 두 예외의 구분이 왜 있을까를 생각해보자
class Storage {
void save(final Value value) {
try {
saveToDb(value);
} catch (final DbException e) {
saveToFile(value);
}
}
}
class Storage {
void save(final Value value) throws DbException {
saveToDb(value);
}
}
직접 예외를 처리하지 않고 호출한 쪽으로 회피한다
그러나 고민없는 회피는 무시와 같으므로 많은 고민 후 회피를 택하자
class Storage {
void save(final Value value) {
try {
saveToDb(value);
} catch (final DbException ignored) { }
}
}
정말 무시를 할 수도 있다. 이 경우에는 더 고민해야 함...
회피는 외부에 전달까지는 하는데, 무시는 이것마저도 없다.
어떤 의도로 무시를 사용했는지가 중요하다
class Storage {
void save(final Value value) {
try {
saveToDb(value);
} catch (final DbException e) {
throw new RuntimeException("데이터를 저장할 수 없습니다.", e);
}
}
}
checked Exception을 unchecked Exception으로 전환할 수 있다
class Storage {
void save(final Value value) {
try {
saveToDb(value);
} catch (final DbException e) {
throw new StorageException("데이터를 저장할 수 없습니다.", e);
}
}
}
추상화 계층(도메인, 뷰, 데이터베이스...등등 각 역할)에 맞는 적절한 예외를 만들 수 있다
-> 중요한 것은 이 예외를 어떻게 바라볼 것인가를 고민하는 것이다
-> 이펙티브자바 : 예외처리 부분을 볼 것
Checked Exception을 사용하는 경우와 Unchecked Exception을 사용하는 자신만의 원칙은 무엇인가?
어떠한 상황에 예외를 복구하는 것이 좋다고 생각하는가? 왜 그렇게 생각하는가?
어떠한 상황에 예외를 회피하는 것이 좋다고 생각하는가? 왜 그렇게 생각하는가?
어떠한 상황에 예외를 무시하는 것이 좋다고 생각하는가? 왜 그렇게 생각하는가?
어떠한 상황에 예외를 전환하는 것이 좋다고 생각하는가? 왜 그렇게 생각하는가?