예외처리(Exception)에 대한 고찰
예외처리의 필요성
대학을 졸업하고 개발자로 회사에 다니면서 개발하는데 있어 가장 큰 차이점은 예외처리의 유무였다. 어떻게든 기능만 동작하면 끝이었던 대학생때와는 다르게 회사에서는, 기능은 기본이고 안정성과 유지보수성을 고려해야하는데, 이를 위해 필수적으로 해야하는 것이 바로 예외처리였다. 한 기능에 대해서도 정말 많은 예외가 발생할 가능성이 있기 때문에 최소한 발생가능성을 인지하고 있는 모든 예외에 대해서는 예외처리가 필요했다.
에러 vs 예외
발생가능성을 인지하고 있는 모든 예외에 대해 처리가 필요하다고 했는데, 이 예외가 뭔지 알기 위해서는 에러와 예외를 구분할 필요가 있다.
에러 | 예외 |
시스템 단계에서 발생 | 프로그램 로직에서 발생 |
프로그래머가 관리하지 않음 | 프로그래가 관리 |
발생 시 프로세스 중단 | 발생 시 프로세스가 중단될 수 있지만 대처 가능 |
ex) 파일 에러, 메모리 고갈 에러 등등 | NullPointer , IndexOutOfBound 등등 |
예외처리 방법
크게 두가지 방법이 있다. try-catch와 throw.
- try-catch를 사용한 예외처리
- try 구간에서 예외가 발생했을 때 catch 구간에서 수행할 내용을 넣는 방식이다.
- 예외처리에 대한 로직을 분리할 수 있다.
- 코드 블록의 크기가 커서 예외처리를 많이 해야하는 경우, 핵심 로직보다 예외처리 로직이 더 많아진다.
- throw를 통한 예외처리
- 예외발생시 해당 메서드를 호출한 곳에 예외를 던진다.
- 한줄로 가능하기 때문에 전체적인 코드 길이를 줄일 수 있다.
- 예외를 받는 쪽에서 try-catch를 사용하여 예외처리를 하는 방법도 있다.
- 리턴 값을 통한 예외처리
- 언어에서 제공하는 예외처리 방법이 아닌 리턴 값을 통해 예외를 처리한다.
- 값에 따라 에러를 정의할 수 있으므로 확장이 쉽다.
- 직접 정의하는 것이므로 값에 대한 일관성이 필요하다.
오랫동안 개발자로 일하신 현업 개발자분들을 보면 try-catch를 선호하지 않는 것을 볼 수 있었다. 개인의 취향이라고 생각하지만 아마 try-catch 3번째 줄 내용이 가장 큰 이유라고 생각한다. 안정성과 유지보수성을 위해 처리해야 하는 예외가 매우 많기 때문이다. 개인적으로는 사전에 규칙을 명확하게 세워두고 리턴 값을 통해 예외처리를 하는 방식이 가장 직관적이고 편했다.
예외처리 시 해야하는 것들
예외를 잡았다면 이제 그 예외에 대해 무엇을 해야하는지도 필요하다. 상황마다 다르게 처리해야하는 로직을 제외하고 공통적으로 해야하는 로직은 다음과 같다.
- 예외를 알 수 있는 값을 출력하거나 전달해야한다.
- 로그를 남긴다.
- 필요한 경우 예외에 대해 세부적으로 들어가 정확한 예외를 찾는다.
- 시스템에 문제가 없다고 판단될 경우 예외를 무시한다.
예외처리는 어떻게 보면 기능을 구현하는데에 있어 가장 필요없다고 생각할 수 있지만 기능의 품질향상을 위해 가장 필요한 내용이다. 대부분의 서비스들은 사용자가 한명이 아닐것이기 때문에 정말 말도안되는 상황들이 생겨날 수 있고 그로인해, 의도하지 않았던 동작이 나올 가능성이 높다. 따라서 예외처리를 하는 습관을 통해 귀찮더라도 꾸준히 한다면 좋은 개발자가 될 수 있을것이라 생각한다.