Exception 있는 그대로 전파
Java에서 예외를 “있는 그대로” 전파하려는 경우 예외를 포착하지 않고 해당 유형이나 메시지를 변경하지 않고 호출 스택 위로 이동할 수 있도록 허용하는 것을 의미합니다. 이는 코드의 특정 수준에서 예외를 처리하지 않고 호출 코드에서 더 높은 수준에서 처리하도록 하려는 경우에 일반적으로 수행됩니다.
예외를 포착하지 않고 전파하는 방법은 다음과 같습니다.
확인되지 않은 예외 전파(Unchecked Exception Propagation)
확인되지 않은 예외(RuntimeException의 하위 클래스)는 선언되거나 포착되지 않고 전파될 수 있습니다. 메서드 시그니처에서 명시적인 처리나 선언이 필요하지 않습니다. 포착되거나 프로그램의 최상위 레벨에 도달할 때까지 호출 스택 위로 전파되도록 할 수 있습니다.
public void methodA() {
throw new RuntimeException("An unchecked exception occurred in methodA");
}
public void methodB() {
methodA();
}
public static void main(String[] args) {
try {
methodB();
} catch (RuntimeException e) {
System.out.println("Caught exception: " + e.getMessage());
}
}
확인된 예외 전파(Checked Exception Propagation)
확인된 예외(RuntimeException이 아닌 Exception의 하위 클래스)는 try-catch 블록을 사용하여 포착하거나 throws 절을 사용하여 메서드 시그니처에서 선언해야 합니다.
public void methodA() throws IOException {
// ...
throw new IOException("A checked exception occurred in methodA");
}
public void methodB() throws IOException {
methodA();
}
public static void main(String[] args) {
try {
methodB();
} catch (IOException e) {
System.out.println("Caught exception: " + e.getMessage());
}
}
이 예에서 IOException은 methodA에서 methodB로 전파되고 결국 main 메서드에 포착됩니다.
Exception 변환 지정
때로는 호출 코드에 더 관련성 높은 정보를 제공하기 위해 한 가지 유형의 예외를 다른 유형으로 변환해야 할 수도 있습니다. 원하는 유형의 새 예외를 생성하고 Throwable 매개변수를 허용하는 생성자를 사용하여 원래 예외를 “원인”으로 전달하면 이를 달성할 수 있습니다. 이는 예외가 발생한 이유에 대한 추가 컨텍스트를 제공하려는 경우 특히 유용합니다.
try {
// Code that may throw an IOException
} catch (IOException originalException) {
// Convert IOException to a custom exception
CustomException customException = new CustomException("An error occurred", originalException);
throw customException;
}
Exception 원인 명시
“원인”을 지정하여 예외가 발생한 이유에 대한 추가 컨텍스트를 제공할 수 있습니다. “원인”은 현재 예외가 발생하도록 트리거한 예외입니다. initCause() 메소드를 사용하여 원인을 명시적으로 설정할 수 있습니다.
try {
// Code that may throw an exception
} catch (Exception originalException) {
CustomException customException = new CustomException("An error occurred");
customException.initCause(originalException);
throw customException;
}
사용자 정의 예외 클래스 생성
예외에 대한 구체적인 정보를 제공하려면 기존 예외 클래스(예: Exception 또는 RuntimeException)를 확장하거나 더 구체적인 예외 클래스를 확장하는 사용자 정의 예외 클래스를 직접 만들 수 있습니다.
public class CustomException extends RuntimeException {
public CustomException(String message, Throwable cause) {
super(message, cause);
}
}
이 예에서 CustomException 클래스는 메시지와 원인을 허용하는 사용자 정의 런타임 예외입니다.
변환, 원인 설정 및 사용자 정의 예외 클래스를 사용하여 더 많은 컨텍스트를 제공함으로써 호출 스택 위로 전파되는 오류 정보의 품질을 향상할 수 있으며, 결과적으로 Java 애플리케이션에서 예외를 더 쉽게 디버깅하고 효과적으로 처리할 수 있습니다.
예외를 전파하는 것은 상위 수준 코드에서 예외를 적절하게 처리하도록 하는 데 유용할 수 있지만 예외의 메시지 또는 사용자 정의 예외 클래스를 통해 예외에 대한 의미 있는 정보를 제공하는 것이 중요합니다. 이는 예외의 원인을 디버깅하고 이해하는 데 도움이 됩니다.
또한 특히 애플리케이션의 최상위 수준으로 확인되지 않은 예외가 과도하게 전파되면 프로그램이 예기치 않게 종료될 수 있습니다. 견고성과 정상적인 오류 처리를 보장하려면 코드베이스의 적절한 수준에서 예외를 포착하고 처리하는 것이 좋습니다.