Java Exception : 예외처리

Study/Java 2020. 8. 9. 12:57 Posted by meanoflife
반응형

Java Exception : 예외처리

 

 

try ~ catch [ ~ finally ]

 

try ~ catch( 트라이 캣치 )문 이라고 읽고 말합니다.

파일 핸들링과 같이 특정 클래스를 사용하려고 하면, 반드시 감싸주어야 합니다.

( 감싸지 않으면 오류가 발생하여 컴파일이 되지 않습니다. 그래서 감싸야 합니다. )

 

※ Checked Exception과 Unchecked Exception
 ▷ Checked Exception 개발자가 반드시 예외처리를 해야함.
 ▷ Unchecked Exception 개발자가 직접 예외처리를 하지 않아도 됨.
Java에서 오류의 종류는 Error와 Exception이 있습니다.
Error는 개발자의 실수가 아닌 툴에서 발생한 오류이기 때문에 개발자가 처리할 수 없습니다.
개발자가 처리할 수 있는 오류는 Exception인데, Checked Exception과 Unchecked Exception으로 나뉩니다.

Unchecked Exception으로는 RuntimeException이 있는데, 이는 런타임시 발생하는 오류로 단순 계산, 범위, 배열 등의 오류로 예외처리를 강제하지 않습니다.
Checked Exception은 반드시 예외처리를 해야 하는 Exception으로 IOException등이 있습니다. 외부 통신(파일 핸들링, 소켓 통신 등)과 같이 예외처리를 하지 않으면 컴파일이 불가능한 Exception 입니다.

 

try ~ catch문을 써야 하는 이유

  1. (앞서 말한것 처럼) 감싸지 않으면 컴파일 오류가 발생하기 때문

  2. 에러가 발생해도 skip(정상처리) 하고 싶을 때

  3. 특정 구간에서 오류발생시 어떤(?) 처리를 하고 싶을 때

 

기본 구조

try {
  // Business-logic
  
} catch( Exception e ) {
  // 오류 발생시 처리 로직

} finally {
  // 항상 수행해야할 로직
  
}

try{ }문에서 오류가 발생하면, 더이상 로직을 수행하지 않고 catch{ }문을 수행하게 됩니다.

finally{ }문은 오류여부와 상관없이 정상이든 오류이든 모두 수행을 합니다.

 

in Project

프로젝트에서 try~catch문을 사용할 일은 많지 않습니다.

원천적으로 오류가 발생하면 안되는 상황이기 때문에, 오류 상황이 발생하지 않도록 사전 Validation등을 처리하기 때문입니다. 오류 발생은 말그대로 오류 입니다. 그럼에도 불구하고 오류가 발생하였을 때를 상정하여 방어소스를 구현할 필요가 있습니다.

 

프로젝트를 하며 사용한 예로는...

① 오류 발생시 (순수 시스템이 띄워주는) 오류 창이 아닌, 특정 메시지를 표시해 줄 경우입니다.

    Ex) ~~~NullPointException.~~~~  → "처리중 오류가 발생하였습니다. 잠시 후 다시 시도해주세요"

 

② DB Connection과 같이 오류시에도 반드시 Close()등의 처리를 해 줘야 하는 경우입니다.

    finally{ }문을 이용하여 conn.close()등을 해 줍니다.

 

Java로 DB Connection을 하고 Exception시 close()를 하지 않아 connection-pool이 발생한 적이 있습니다.

정상처리든 오류 발생시든 반드시 connection을 끊어줘야 하는데, 그렇지 않아 발생한 오류입니다.

try~catch 문의 try{ }문 끝과 catch{ }문 안에 모두 close()를 넣어줘도 상관없지만 finally{ } 문을 이용하면 한번에 처리가 가능합니다. ( 중복소스가 없어야 이 후 유지보수에 편리합니다. )

Connection conn = null
PrepareStatement stmt = null
ResultSet rs = null

try {
  // DB접속 후 SELECT/INSERT/UPDATE/DELETE 등을 처리
  
} catch {
  // 오류 발생시 오류Log Table에 에러정보 적재
  
} finally {
  // Session Close
  rs.close();
  stmt.close();
  conn.close();
  
}

위와 같이 finally{ }문 안에서 세션을 닫는 Syntax를 처리합니다.

 

어찌보면 너무도 기본적이고 당연한 것이지만, 

실제 프로젝트를 하다보면 이런 사소한 것들을 간과하는 경우를 많이 보게 됩니다.

최근 프로젝트에서도 close()를 해줘야 하는 것, 자체를 인지하지 못하는 개발자들이 여럿 있었습니다.

 

요즘 HardWare가 워낙 고사양이고 성능이 좋아, 대충 코딩을 해도 기능과 성능이 이슈가 별로 없는 것이 사실입니다.

하지만, 개발자로써 상황과 관계없이 좀 더 효율적인 코딩을 해야하지 않나... 하는 생각을 해봅니다.

 

반응형