인프런 커뮤니티 질문&답변

인프린님의 프로필 이미지
인프린

작성한 질문수

김영한의 실전 자바 - 중급 1편

try-with-resources

Try-with-resources 질문

작성

·

175

0

안녕하세요.

Try-with-resource 질문 있습니다.

강의에서는 disconnect() 메서드에서 예외가 발생하지 않도록 하여서 @Override close()에서 throws Exception 구문을 지웠는데요.

만약에 disconnect()메서드에서 예외가 발생하도록 작성했다면 close() throws Exception으로 예외를 던졌을 때 try-with-resource 쪽(호출한 쪽)에서는 sendMessage() 메서드에서 throws Exception으로 처리를 따로 해야 하나 ? 그리고 직접 예외를 잡으려면 어떻게 해야 하나요 ? 왠지 try 구문 안에서 발생한 거니 자연스레 catch 구문으로 넘어갈거 같기도 해서요. 확인 부탁드립니다.

@Override
public void close() throws Exception {
    System.out.println("NetworkClientV5.cloase");
    disconnect(); //만약 예외 발생시, try-catch로 여기서 직접 잡아주지 않으면
}
public void sendMessage(String data){
    String address = "http://example.com";
    try (NetworkClientV5 client = new NetworkClientV5(address)){ 
        client.initError(data);
        client.connect();
        client.send(data); //AutoClosable 이니 여기서 나갈 때 예외가 발생 -> 이럴 떈 sendMessage 쪽에서 sendMessage(String data) throws Exception 처리 해야 하나 ? 만약 그 에러를 직접 잡으려고 try catch 구문을 쓰려면 어떻게 해야 하나
    } catch(Exception e){
        System.out.println("예외 확인 = " + e.getMessage());
        throw e;
    }

 

답변 1

0

안녕하세요. 인프린님, 공식 서포터즈 y2gcoder입니다.

해당 케이스는 다음과 같이 세 가지 경우로 나눌 수 있습니다:

  1. try block 예외 O && close() 예외 X

  2. try block 예외 X && close() 예외 O

  3. try block 예외 O && close() 예외 O

첫 번째와 두 번째 경우에는 발생한 예외가 각각 try-with-resources 문의 catch 블록에서 바로 잡히게 됩니다.

세 번째 경우에는 다음과 같이 처리됩니다:

  • try 블록에서 발생한 예외는 주 예외가 됩니다.

  • close() 메서드에서 발생한 예외는 Suppressed Exception(링크) 가 되어 주 예외 안에 포함됩니다.

이렇게 억제된 예외는 Throwable.getSuppressed() 메서드를 통해 조회할 수 있습니다.

위의 링크를 클릭하셔서 개념을 참고하시고, 강의 코드를 토대로 직접 테스트 코드를 작성해보시면 더 좋은 학습이 되실 거라 생각합니다 🙂

 

감사합니다.

인프린님의 프로필 이미지
인프린

작성한 질문수

질문하기