작성
·
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입니다.
해당 케이스는 다음과 같이 세 가지 경우로 나눌 수 있습니다:
try block 예외 O && close() 예외 X
try block 예외 X && close() 예외 O
try block 예외 O && close() 예외 O
첫 번째와 두 번째 경우에는 발생한 예외가 각각 try-with-resources
문의 catch
블록에서 바로 잡히게 됩니다.
세 번째 경우에는 다음과 같이 처리됩니다:
try
블록에서 발생한 예외는 주 예외가 됩니다.
close()
메서드에서 발생한 예외는 Suppressed Exception(링크) 가 되어 주 예외 안에 포함됩니다.
이렇게 억제된 예외는 Throwable.getSuppressed()
메서드를 통해 조회할 수 있습니다.
위의 링크를 클릭하셔서 개념을 참고하시고, 강의 코드를 토대로 직접 테스트 코드를 작성해보시면 더 좋은 학습이 되실 거라 생각합니다 🙂
감사합니다.