잊을만하면 한 번씩 올라오는 자바 Exception에 대한 글을 하나 소개할까 합니다.
작년에 왔던 각설이 죽지도 않고 또 오는 거 보면 정말 자바에서 중요한 부분이지 않을까 합니다.
개인적으로도 Exception에 대해서는 최대한 잘 처리를 하려고 하는 편이지만, Best Practice에 반하는 경우도 많아서 다시 한번 정리를 해 볼 겸 해서 간단히 정리해 봅니다.
원문은 아래 링크를 통해서 확인 가능합니다. 원문 꼭 확인 하시길 추천하는건 다 아시리라 생각하며...
1. Catch 블록에서 Exception을 확인할 수 있는 어떤 처리를 하지 않고 그냥 소비하지 말라고 합니다. 즉, Catch 블록에서 로그를 남기지 않고 그냥 리턴해 버리거나 하는 경우인데요. 저도 가끔은 그냥 이렇게 하는 경우도 있긴 합니다만, Exception이 정말 발생하면 안 되는 경우라면 절대 그러면 안 되겠지요? 해당 Exception이 발생했는지를 모른다면 안 될 테니 말이죠. 적당한 대응을 위해서라도 어떤 Exception이 발생해서 처리를 한 것인지 정도는 알 수 있도록 프로그램 하는 게 맞습니다. 만약 Exception에 대한 대응이 필요 없다면 차라리 10번 항목처럼 처리를 하는 것을 추천합니다.
2. Method에 throws 를 지정할 때 Exception으로 하지 말라고 합니다. 즉, Exception이 아니라 특정 Exception을 지정하라는 것인데요. 개인적으로는 본인이 특정 Exception을 상속받아서 만든 Exception을 throws 하는 것을 추천합니다. 물론 항상 그런 건 아니고요.
3. 2번과 비슷한 맥락에서 catch 를 할 때 Exception 으로 catch 하지 말라는 것입니다. 네. 맞습니다. 당연한 이야기입니다. 근데... 저도 그렇지만 귀찮으면 그냥 그렇게 프로그램 하는 경우가 많지요^^
4. Never catch any Throwable class. 설명이 좀 난해해서 패스.. 어떤 경우를 말하는 것인지 잘 모르겠네요.
5. Catch 블록에서 throw를 하는 경우 2번의 경우처럼 본인이 작업한 Custom Exception을 발생시키는데 이때 에러 정보를 정확히 포함시켜서 보내라는 내용입니다. 즉, message만 만들어서 Exception을 throw 하지 말고 exception 객체를 같이 넘기라는 내용인데요. 원문에는 샘플이 있습니다. 샘플 보시는 것이 한방에 이해돼요.
6. Catch 블록에서 로그를 남기거나 throw를 하게 되는데, 두 가지를 함께 하지 말라는 내용입니다. throw 한다면 throw를 catch 한 쪽이 있을 수 있으니 throw 하면서 Log를 남길 필요는 없겠죠? 예전 회사에서 작업할 때 이런 코드들이 많이 생기곤 했는데... 제가 만든 클래스에서 임시적으로 확인을 위해 Catch를 하고 로그를 남긴 후에 Custom Exception을 throw 했는데 사용하는 쪽에서 당연하게도 Log를 남기는 거죠. 이럼 로그양만 늘어날 뿐이죠. 나중에 확인하고 지우긴 했지만, 아예 두 가지를 같이 쓰지 않는다면 해결되는 문제입니다.
7. finally 블록에서 throw가 일어날 상황을 만들지 말라는 내용입니다. 당연하죠? finally에서 Exception 발생하면 어떻게 될까요?
8. 처리하지 않을 Exception에 대해서 catch 하지 말라는 이야기입니다. 보통 많이 하는 게 catch 블록 내에 해당 Exception을 그대로 throw 하는 경우가 되겠습니다. 그런데 보통... 이렇게 하나요?
9. catch 블록에서 에러에 대해 임시로라도 printStackTrace() Method를 사용하지 말라는 것입니다. 요즘은 보통 많이 안 쓰시지 않나요?
10. 일반적인 Exception을 처리하기 위해 try를 쓰긴 했는데 어떤 Exception에도 별다른 처리를 하지 않을 경우엔 그냥 finally 블록만 가지고 처리를 하라는 내용입니다. 1번에서 추천했던 방법입니다.
원문을 그대로 옮기지 않았습니다. 자세한 내용은 원문을 꼭 읽어주시길...
사실 이렇게 정리를 해 놓는 이유는 제가 나중에라도 보려 하거나 후배들에게 알려줘야 할 경우에 참고하기 위해서인데... 항상 원문을 훔쳐 온 것 같은 느낌이라... 꼭 원문을 읽어주세요.
[Update, 2020-05-19]
마침 Throwable에 대해 총정리 된 느낌의 Post를 발견했습니다(아래 링크입니다).
Exception을 정의하고 사용하는 방법들에 대한 다양한 부분을 볼 수 있는 글이네요.
꽤 이래저래 알고 있었다고 생각했는데, 보면서 많이 배웠습니다. 역시 고수는 많고 배울 것이 넘쳐나는 세상이라는 사실에 왠지 즐거워집니다. (전투력 재상승!!!)
댓글
댓글 쓰기