본문 바로가기
Programing/Java

How to use exceptions effectively? (어떻게 Exception을 효율적으로 사용할까?)

by Tomining 2017. 8. 28.
본 글은 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만 정리해 보자.

  1. Use exceptions appropriately(exception을 적절히 사용하라)
  2. Use specific exceptions(정학한 exception을 사용하라)
  3. Never ignore an exception(exception을 절대로 무시(skip)하지 마라)
  4. Handle or propagate(처리하거나 상위로 전달하거나)
  5. Use abstract exception(추상 exception을 사용하라)
  6. Never display exceptions to end user(사용자에게 exception을 노출하지 마라)
  7. Use common exceptions and errors codes in API(공통 exception 또는 error code를 사용하라)
  8. Add usable information to your exception(exception에 유용한 정보를 포함시켜라)
  9. Closing resources(자원을 잘 정리해라.)
  10. Exceptions shouldn’t break object’s state(exception은 객체의 상태를 다루지 마라)
  11. Either survive or shut down(process가 계속 살아 있거나 중지되거나)

11가지 모두 공감가는 내용이다.
Exception은 처리도 중요하지만 발생한 이유도 중요하다.

개발을 하다보면 NPE(NullPointException, 이하 NPE) 은 발생하면 안 되는 것처럼 이야기하는 개발자가 많이 있다.
나도 그 생각에 대부분 동의한다. 하지만 NPE가 발생해야만 하는 경우도 있다.
예를 들어 필수값으로 지정한 값이 전달되지 않았을 때, if 문을 통한 validation check가 꼭 필요한 것일까? 필수값이라면 보통 잘 전달된다. 하지만 전달되지 않은 경우를 어떻게 처리하는 것이 맞을까?

  • 필수값 누락 여부를 체크 —> 별도 처리
  • NPE 발생 —> Exception catch

두 방식 모두 결과는 같다. 어떤 방식이 나을까? 대부분의 개발자는 첫 번째 방식을 택할 것이다.
개인마다 차이가 있겠지만 개인적으로 두 번째 방법도 나쁘지 않다고 생각한다.(그럼에도 난 첫 번째 방식을 선택할 것이다.)
"두 번째 방법이 틀렸다"라고 말할 수 있을까? 단지 방법이 다를 뿐… 개인 선호도 또는 동료들과의 협업을 위한 컨벤션 정도로 협의되면 될 내용일 것이다.

      다시 한 번 언급하지만 Exception 처리에 대한 왕도는 없다. 결과적으로 문제가 없이 잘 처리되면 된다.(여기서 Exception으로 인한 성능은 논외로 한다.)