본 글은 http://programmergate.com/use-exceptions-effectively/ 를 번역 & 요약한 글입니다.
Exception에 대한 글은 수도 없이 많다. 본 블로그 글을 읽어보면서도 책에 나온 교과서 적인 이야기를 하고 있다고 느꼈다.
그 이유는 Exception이라는 것은 처리에 왕도(Royal Way)가 없기 때문이다.
그럼에도 Exception에 대한 글이 의미가 있는 것은 Exception 처리는 프로그래밍에서 없어서는 안 될 중요한 요소 중 하나이기 때문이다.
“How to use exceptions effectively?” 에서 언급하고 있는 내용은 기본적이고 간단한 내용들이다.
하지만 잘 지키고 적용하기는 쉽지 않을 수 있다.
자바에서 Exception은 checked 와 unchecked Exception으로 나눠진다. 차이에 대해서는 http://tomining.tistory.com/153 에서 설명해 두었다. 참고하자.
이런 Exception을 어떻게 처리할 수 있을까? 블로그에서는 11가지를 언급하고 있다. Keyword만 정리해 보자.
- Use exceptions appropriately(exception을 적절히 사용하라)
- Use specific exceptions(정학한 exception을 사용하라)
- Never ignore an exception(exception을 절대로 무시(skip)하지 마라)
- Handle or propagate(처리하거나 상위로 전달하거나)
- Use abstract exception(추상 exception을 사용하라)
- Never display exceptions to end user(사용자에게 exception을 노출하지 마라)
- Use common exceptions and errors codes in API(공통 exception 또는 error code를 사용하라)
- Add usable information to your exception(exception에 유용한 정보를 포함시켜라)
- Closing resources(자원을 잘 정리해라.)
- Exceptions shouldn’t break object’s state(exception은 객체의 상태를 다루지 마라)
- Either survive or shut down(process가 계속 살아 있거나 중지되거나)
11가지 모두 공감가는 내용이다.
Exception은 처리도 중요하지만 발생한 이유도 중요하다.
개발을 하다보면 NPE(NullPointException, 이하 NPE) 은 발생하면 안 되는 것처럼 이야기하는 개발자가 많이 있다.
나도 그 생각에 대부분 동의한다. 하지만 NPE가 발생해야만 하는 경우도 있다.
예를 들어 필수값으로 지정한 값이 전달되지 않았을 때, if 문을 통한 validation check가 꼭 필요한 것일까? 필수값이라면 보통 잘 전달된다. 하지만 전달되지 않은 경우를 어떻게 처리하는 것이 맞을까?
- 필수값 누락 여부를 체크 —> 별도 처리
- NPE 발생 —> Exception catch
두 방식 모두 결과는 같다. 어떤 방식이 나을까? 대부분의 개발자는 첫 번째 방식을 택할 것이다.
개인마다 차이가 있겠지만 개인적으로 두 번째 방법도 나쁘지 않다고 생각한다.(그럼에도 난 첫 번째 방식을 선택할 것이다.)
"두 번째 방법이 틀렸다"라고 말할 수 있을까? 단지 방법이 다를 뿐… 개인 선호도 또는 동료들과의 협업을 위한 컨벤션 정도로 협의되면 될 내용일 것이다.
다시 한 번 언급하지만 Exception 처리에 대한 왕도는 없다. 결과적으로 문제가 없이 잘 처리되면 된다.(여기서 Exception으로 인한 성능은 논외로 한다.)
'Programing > Java' 카테고리의 다른 글
Collectors.toMap() 시 IllegalStateException 오류 (0) | 2017.12.26 |
---|---|
Jackson @JsonView 사용기 (0) | 2017.09.27 |
Java에서 String과 new String()의 차이는? (2) | 2017.08.24 |
Jackson을 이용한 org.joda.time.DateTime 파싱하기 (0) | 2017.07.27 |
Jackson을 이용하여 JSON -> POJO 변환시 POJO에 존재하지 않는 property가 있는 경우 (0) | 2017.07.21 |