예외를 던지고 난 뒤에도 객체는 상태가 이전 상태와 동일하며 사용가능한 형태로 남아있어야 한다. 특히 checked exception의 경우 그렇다.
위와 같은 코드 처럼 빈 스택에서 뭔가 뽑아내려고 할때 먼저 상황을 체크하고 exception을 throw하여 실패 원자성(failure atomicity)을 갖춘 코드라 볼수 있다.
방법은 크게 두가지가 있다.
1. exception이 났을 때 roll back될수 있도록 코드를 구성한다.
2. 실패할 가능성이 있는 코드를 전부 객체 상태를 바꾸는 코드앞에 배치한다.
이러한 실패 원자성은 권장하지만 가은 객체를 여러 스레드가 동기화 없이 접근하는 것과 같은 특수한 경우에는 객체 상태의 일관성이 깨질 가능성이 있다.
또한 실패 원자성을 달성하기 위해 코드의 비용이나 복잡성이 심각하게 늘어날 가능성도 있다.(그래서 해라는거야 말라는 거야...)
결론 : 메서드에 포함된 예외가 발생하더라도 최대한(할 수 있다면) 객체 상태는 메서드 호출 이전과 동일하게 유지시킨다.
End of Document
반응형
'개발이야기 > Effective Java' 카테고리의 다른 글
[Effective Java]작명 패턴 대신 어노테이션을 사용하라 (575) | 2017.03.10 |
---|---|
[Effective Java]int 상수 대신 enum을 사용하라 (1100) | 2017.03.10 |
[Effective Java]예외를 무시하지 마라 (954) | 2017.03.04 |
[Effective Java]어떤 오류인지를 드러내는 정보를 상세한 메시지에 담으라 (0) | 2017.03.04 |
[Effective Java]메서드에서 던져지는 모든 예외에 대해 문서를 남겨라 (0) | 2017.03.04 |
[Effective Java]표준 예외를 사용하라 (0) | 2017.03.04 |