예외 처리

2020. 4. 25. 22:58기타

1. Error(에러)와 Exception(예외)의 차이

Error

 Error란 컴퓨터 하드웨어의 오동작 혹은 고장으로 인해 응용프로그램에 이상이 생기거나 JVM 실행에 문제가 생겼을 경우 발생하는 것을 말합니다. 이 경우, 개발자는 대처할 방법이 극히 제한적입니다.

Exception

 Exception이란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말합니다. Exception이 발생하면 프로그램이 종료가 된다는 것은 Error와 같습니다. 하지만 Exception은 Exception Handling을 통해 프로그램을 종료하지 않고 정상적으로 작동되게 만들 수 있습니다.

2. Checked Exception과 Unchecked Excption

Checked Exception

 컴파일 시간에 검사하는 예외로서, 처리하지 않으면 컴파일 에러가 나기 때문에 반드시 처리해야 합니다. 처리 방법에는 try ~ catch로 감싸거나 throws로 이를 호출한 메서드에게 예외를 넘겨주는 방법이 있습니다.

Unchecked Exception

 런타임 시간에 검사하는 예외로서, 컴파일하는데 문제는 없지만 실행 중에 예외가 발생할 수 있습니다. 주로 프로그래머의 실수, 잘못 작성된 코드, 사용자가 어플리케이션을 잘못 사용할 때 발생합니다.

3. 예외를 처리하는 방법

Try ~ catch

try{
    //에러가 발생할 수 있는 코드
    throw new Exception(); //강제 에러 출력 
}catch (Exception e){
    //에러시 수행
     e.printStackTrace(); //오류 출력(방법은 여러가지)
     throw e; //최상위 클래스가 아니라면 무조건 던져주자
}finally{
    //무조건 수행
}

 Try 블록에는 예외가 발생할 수 있는 코드가 위치합니다. Try 블록의 코드가 예외 없이 정상 실행되면 catch 블록의 코드는 실행되지 않고 finally 블록의 코드를 실행합니다. 하지만 try 블록의 코드에서 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하여 예외처리 코드를 실행합니다.

주의사항
 예외 처리를 해 주어야 하는 경우에만 사용해야 의미가 있습니다. Try ~ catch는 예외에 대한 적절한 처리를 해주는 것인데 로그만 찍는 용도이면 반드시 해 줄 필요가 없습니다. 잘못 사용하게 될 경우, 예외가 어디서 발생했는지 못 찾는 경우가 발생할 수도 있습니다.

Throws로 예외 객체를 넘기기

static void callDriver() throws ClassNotFoundException{
        Class.forName("oracle.jdbc.driver.OracleDriver");
        System.out.println("완료");
}

 위와 같이 예외를 직접 처리하지 않고 throw를 통해 메소드를 호출한 지점으로 예외를 전달하여 처리합니다.

로그에 예외 정보 출력하기

private static final Logger log = LoggerFactory.getLogger(JdbcTemplate.class);

public void update(String query) {
  try {
    // ...
  } catch (SQLException e) {
    log.error("Fail update :", e);
  }
}

 로그 출력을 통해 어디서 에러가 발생한 것인지 쉽게 확인할 수 있습니다.

RuntimeException으로 throw 하기

public void update(String query) {
  try {
    // ...
  } catch (SQLException e) {
    throw new DataAccessException(e);
  }
}

 위처럼 CheckedException을 UncheckedException으로 변경해 전달합니다. 다만 이 경우에는 발생한 예외에 대한 정보를 보존해야 하기 때문에 새로 생성하는 예외의 인자로 기존의 예외 정보를 넘겨줍니다.

주의사항
 예외가 발생할 때는 비용의 소모가 상당히 큽니다. 왜냐하면 스레드의 스택에 쌓여있는 정보들을 토대로 trace하는 것이 성능에 영향을 미치기 때문입니다. Stack depth에 따라 비용이 달라지는데 실행되는 서비스의 복잡도에 따라 depth가 깊어지는 만큼 exception의 생성 비용이 증가합니다. 따라서 UncheckedException을 throw 하는 것은 상당한 비용이 발생하며 성능이 저하될 수 있기 때문에 조심히 사용해야 합니다.

예외 발생 비용 관련 참고: http://java-performance.info/throwing-an-exception-in-java-is-very-slow/

728x90

'기타' 카테고리의 다른 글

Git Merge와 Rebase  (0) 2020.04.26
객체 지향 프로그래밍의 5원칙  (0) 2020.04.26
API  (0) 2020.04.22
QueryString과 Path Variable은 각각 언제 사용하는가  (0) 2020.04.09
반응형 웹  (0) 2020.03.29