Skip to content

Latest commit

 

History

History
47 lines (33 loc) · 4.79 KB

Error_and_Exception.md

File metadata and controls

47 lines (33 loc) · 4.79 KB

Error and Exception

자바에서 throw를 통해 발생시킬 수 있는 예외에는 Error, Exception과 체크 예외, RuntimeException과 언체크/런타임 예외가 있다.

Error

java.lang.Error 클래스의 서브클래스들

  • 시스템에 뭔가 비정상적인 상황이 발생한 경우에 사용 (주로 자바 VM)
  • OutOfMemoryError, ThreadDeath

-> 시스템 레벨에서 특별한 작업을 하는게 아니라면 애플리케이션에서는 이런 에러는 신경 쓰지 않아도 된다.

Exception과 체크 예외

java.lang.Exception 클래스와 그 서브클래스로 정의되는 예외들

  • 개발자들이 만든 애플리케이션 코드의 작업 중에 예외상황이 발생한 경우에 사용
  • IOException, SQLException
  • Exception 클래스는 다시 체크 예외(RuntimeException을 상속하지 않음)와 언체크 예외(RuntimeException을 상속함)로 구분된다. 자바에서는 RuntimeException과 그 서브클래스는 특별하게 다루기 때문에, Exception 클래스의 서브클래스들을 구분한다. 일반적으로 예외라고 하면 체크 예외를 말한다.

-> 체크 예외가 발생할 수 있는 메서드를 사용할 경우 반드시 예외를 처리하는 코드를 함께 작성해야 한다. 만약 메서드가 체크 예외를 던졌는데 처리 코드가 없으면 컴파일 에러가 발생한다.

RuntimeException과 언체크/런타임 예외

java.lang.RuntimeException 클래스를 상속한 예외들

  • 프로그램에서 오류가 발생한 경우에 사용 (피할 수 있지만 개발자가 부주의해서 발생된 것)
  • NullPointerException, IllegalArgumentException
  • 명시적인 예외처리를 강제하지 않기 때문에 언체크 예외로 불린다. 또는 대표 클래스 이름을 따서 런타임 예외라고도 한다.

-> Error와 마찬가지로 잡거나 처리하지 않아도 된다.

예외 처리 방법

1. 예외 복구

예외상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는다.

  • 예시 1 : 사용자가 요청한 파일을 읽으려고 시도했는데 해당 파일이 없어서 IOException이 발생했다. 이 때 사용자에게 상황을 알려주고 다른 파일을 이용하도록 안내하여 예외상황을 해결할 수 있다.
  • 예시 2 : 네트워크가 불안해서 원격 DB 서버에 접속 실패했고 SQLException이 발생했다. 이 때 일정 시간 대기했다가 정해진 횟수만큼 다시 접속을 시도하여 예외 상황을 해결할 수 있다. 끝까지 실패했다면 예외 복구는 포기한다.

2. 예외 처리 회피

예외처리를 자신이 담당하지 않고 자신을 호출한 쪽으로 던져버린다. 예외를 자신이 처리하지 않고 회피하는 방법이다. 주의해야할 점은, 예외를 회피하는 것은 예외를 복구하는 것처럼 의도가 분명해야한다는 것이다. 콜백/템플릿처럼 긴밀한 관계에 있는 다른 오브젝트에게 책임을 전달하는게 최선의 방법이라는 확신이 있어야 한다.

  • 예시 1 : jdbcTemplate이 사용하는 콜백 오브젝트는 PreparedStatement를 이용해서 작업하다 발생하는 SQLException을 자신이 처리하지 않고 템플릿으로 던져버린다. SQLException을 처리하는 일은 콜백 오브젝트의 역할이 아니라고 보기 때문이다.

3. 예외 전환

예외 회피와 비슷하게 예외를 메서드 밖으로 던져버린다. 하지만 발생한 예외를 그대로 넘기는 예외 회피와 달리 적절한 예외로 전환해서 던진다는 특징이 있다. 발생한 예외를 그대로 던지는 것이 적절한 의미를 전달해주지 못하는 경우, 의미를 분명하게 해주기 위해 예외를 전환한다. 또는, 예외를 처리하기 쉽고 단순하게 만들기 위해 래핑하는 목적으로 전환한다.

  • 예시 1 : 새로운 사용자를 등록하려고 시도했을 때, 아이디가 같은 사용자가 있어 DB 에러가 발생하면 JDBC API는 SQLException을 발생시킨다. 만약 DAO 메서드가 SQLException을 그대로 던지면 서비스 계층에서는 왜 그 예외가 발생했는지 쉽게 알지 못한다. 아이디 중복의 경우 의미를 해석해서 DuplicateUserIdException과 같은 예외로 바꿔서 던져주는 게 좋다.
  • 예시 2 : EJB 컴포넌트 코드에서 발생하는 대부분의 체크 예외는 비즈니스 로직 관점에서 의미있는 예외이고 복구할 방법이 없다. 어차피 복구하지 못할 예외라면 런타임 예외인 EJBException으로 포장해서 던지고, 예외처리 서비스 등을 이용해 자세한 로그를 남기고, 관리자에게 메일로 통보하고, 사용자에게 안내 메시지를 보여주는 식으로 처리하는게 바람직하다.

참고

토비의 스프링 3.1 Vol.1 4장