본문 바로가기
Java

Java 중급 1 - 예외처리(4)

by KongJiHoon 2025. 5. 10.

1. 예외 게층1 - 시작

🎯 목적

예외를 단순 오류 코드로 분류하지 않고, 객체 계층으로 설계하여 더 정밀하게 예외를 다룬다.

 

예시

// 모든 네트워크 관련 예외의 부모
public class NetworkClientExceptionV3 extends Exception { ... }

// 연결 실패 예외
public class ConnectExceptionV3 extends NetworkClientExceptionV3 {
    private final String address;
    ...
}

// 전송 실패 예외
public class SendExceptionV3 extends NetworkClientExceptionV3 {
    private final String sendData;
    ...
}

👍 장점

  • 부모 타입으로 모든 자식 예외를 한 번에 catch 가능
  • 자식 타입을 이용해 세분화된 예외 처리 가능
  • 각각의 예외는 자체 정보를 가짐 → 코드 가독성 향상

 

2. 예외계층 2 - 활용

🎯 다양한 예외 상황에 따라 적절히 분기 처리

try {
    client.connect();
    client.send(data);
} catch (ConnectExceptionV3 e) {
    log("[연결 오류] 주소: " + e.getAddress());
} catch (NetworkClientExceptionV3 e) {
    log("[네트워크 오류] 메시지: " + e.getMessage());
} catch (Exception e) {
    log("[알 수 없는 오류] 메시지: " + e.getMessage());
}
  • catch는 상속 구조의 자식부터 부모 순서로 배치해야 함
  • 필요한 경우 | 연산자를 통해 다중 예외를 한 번에 처리 가능
catch (ConnectExceptionV3 | SendExceptionV3 e) {
    log("[연결 또는 전송 오류] 메시지: " + e.getMessage());
}

 

3. 실무 예외 처리 방안 1 - 설명

✅ 처리할 수 없는 예외

예: 네트워크, DB 연결 실패
애플리케이션에서 복구 불가능
→ 사용자에게 오류 안내 메시지, 로그 남기기 필수

 

❌ 체크 예외의 단점

  • throws 선언이 누적되면서 코드가 지저분해지고 가독성 저하
  • 결국 throws Exception이라는 안 좋은 습관 발생

 

4. 실무 예외 처리 방안2 - 활용

✅ 언체크 예외로 리팩토링

public class NetworkClientExceptionV4 extends RuntimeException { ... }
public class ConnectExceptionV4 extends NetworkClientExceptionV4 { ... }
public class SendExceptionV4 extends NetworkClientExceptionV4 { ... }

장점

  • throws 선언 필요 없음
  • 필요한 경우에만 catch 가능
  • 복구 불가능한 예외는 공통 처리 로직에서 일괄 처리

예시

try {
    networkService.sendMessage(input);
} catch (Exception e) {
    handleException(e);
}

private static void handleException(Exception e) {
    System.out.println("죄송합니다. 시스템 오류가 발생했습니다.");
    e.printStackTrace(); // 디버깅용 로그
    if (e instanceof SendExceptionV4 se) {
        log("전송 실패 데이터: " + se.getSendData());
    }
}

 

5. Try-With-Resources

✅ 리소스 누수 방지 자동화

public class NetworkClientV5 implements AutoCloseable {
    public void close() {
        disconnect();
    }
}

try (NetworkClientV5 client = new NetworkClientV5(address)) {
    client.connect();
    client.send(data);
}

 

 

장점

  • finally 없이도 자원 반납 보장
  • AutoCloseable 인터페이스 덕분에 코드 간결 + 안전

 

정리

항목 추천 방식
예외 설계 예외 계층을 정의해 세분화
복구 불가능한 예외 언체크 예외 (RuntimeException) 사용
자원 반환 try-with-resources 또는 finally 사용
공통 예외 처리 한 곳에서 Exception을 catch 후 instanceof로 분기

 

'Java' 카테고리의 다른 글

자바 중급 2편 - 제네릭(2)  (0) 2025.05.15
자바 중급 2편 - 제네릭(1)  (0) 2025.05.11
Java 중급 1 - 예외처리(3)  (0) 2025.05.05
Java 중급 1 - 예외처리(2)  (0) 2025.05.04
Java 중급 1 - 예외처리(1)  (0) 2025.05.02