자바에서 예외 처리 관련해서 자주 보는 문법은 크게 세 가지다.
try-catchtry-finallytry-with-resources이 셋은 서로 대체 관계라기보다는, 역할이 조금씩 다른 도구 세트라고 이해하는 게 좋다.
try-catch의 목적은 예외를 잡아서 처리/전환/로그하는 것이다.
try {
doBusiness(); // 여기서 예외 발생 가능
} catch (IOException e) {
// 예외 처리 (로그, 사용자 메시지, 래핑 등)
log.error("I/O 실패", e);
throw new CustomException(e);
}
특징:
close()를 호출해야 한다.즉, try-catch는 “예외를 어떻게 다룰 것인가”에 집중된 문법이다.
try-finally의 역할은 예외가 나든 말든, 마지막에 반드시 실행해야 하는 정리 작업을 넣는 것이다.
Lock lock = lock();
try {
// 동시성 민감한 비즈니스 로직
doCriticalWork();
} finally {
lock.unlock(); // 예외가 나도 무조건 호출
}
또는 자원 해제:
InputStream in = null;
try {
in = new FileInputStream("data.txt");
readData(in);
} finally {
if (in != null) {
in.close(); // 여기서 예외가 나면, 원래 예외를 덮어버릴 수 있음
}
}
특징:
finally 블록은:return 해도,unlock(), close(), release() 같은 정리/해제 작업을 넣을 때 많이 사용한다.close() 양쪽에서 예외가 나면,그래서 요즘은 “자원 해제” 용도로 try-finally를 새로 쓰는 경우는 거의 없고,
락/트랜잭션 경계 같은 곳에 제한적으로 쓰는 편이다.
try-with-resources는 Java 7에서 도입된 문법으로,
닫아야 할 자원(AutoCloseable) 을 안전하고 간결하게 처리하기 위한 특화된 형태다.
try (FileInputStream in = new FileInputStream("data.txt")) {
readData(in); // 여기서 예외 A 발생 가능
}
동작:
try (...) 괄호 안에 선언한 자원은 try 블록이 끝날 때 자동으로 close() 호출된다.close() 과정에서 예외 B가 또 터져도:A.getSuppressed()에 Suppressed 예외로 붙는다.예시:
try (MyResource r = new MyResource()) {
r.doWork(); // 예외 A
} catch (Exception e) {
// e == A (비즈니스 예외)
for (Throwable sup : e.getSuppressed()) {
// 여기에 close() 중 발생한 예외 B들이 들어있음
}
}
왜 “더 안전”하냐면:
추가로:
자원 여러 개도 자연스럽게 처리 가능.
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
// JDBC 로직...
} // 여기서 rs → ps → conn 순서로 자동 close
코드가 짧고, 실수할 여지가 훨씬 적다.
실무 기준으로 정리하면 이렇게 쓸 수 있다.
try-catch / try-catch-finally한 줄로 요약하면:
try-catch는 예외를 “어떻게 처리할지”에 대한 구조,try-finally는 “예외와 상관없이 마지막에 반드시 실행할 작업”을 위한 구조,try-with-resources는 AutoCloseable 자원을 자동으로 안전하게 닫고,
비즈니스 예외와 close 예외가 동시에 터져도 중요한 쪽(비즈니스 예외)을 보존해 주는 현대식 패턴이다.
[참조]
https://mungto.tistory.com/526
https://www.baeldung.com/java-try-with-resources
https://velog.io/@ntigo/%EC%95%84%EC%9D%B4%ED%85%9C-9.-try-finally-%EB%B3%B4%EB%8B%A4-try-with-resources%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%9D%BC
https://www.linkedin.com/posts/moresh-shende_java-exceptionhandling-bestpractices-activity-7308522684223565824-GsBR