UncaughtExceptionHandler는 Thread 클래스 내부에 정의된 인터페이스입니다. 메인 스레드가 처리되지 않은(uncaught) 예외로 인해 종료되기 직전, JVM(Java Virtual Machine)은 해당 스레드의 UncaughtExceptionHandler를 호출합니다. 이를 통해 스레드가 종료되기 전에 예외 정보를 파일에 기록하거나 로그를 서버로 전송하는 등의 오류 처리 작업을 수행할 수 있는 기회를 얻게 됩니다.
또한 모든 스레드에서 발생하는 처리되지 않은 예외에 대해 공통적으로 호출되는 기본(Default) 예외 핸들러를 설정할 수도 있습니다. UncaughtExceptionHandler는 Java 5 버전부터 도입되었습니다.
핸들러 설정 방법
이 핸들러는 java.lang.Thread 클래스의 아래와 같은 정적(static) 메서드를 사용하여 설정할 수 있습니다.
public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ueh)
설정하려면 Thread.UncaughtExceptionHandler 인터페이스의 구현체를 제공해야 하며, 이 인터페이스에는 단 하나의 메서드만 선언되어 있습니다.
문법(Syntax)
@FunctionalInterface
public interface UncaughtExceptionHandler {
void uncaughtException(Thread t, Throwable e);
}
uncaughtException 메서드는 예외가 발생한 스레드 객체(t)와 발생한 예외 객체(e)를 매개변수로 전달받습니다. 함수형 인터페이스이므로 람다 표현식으로도 간결하게 구현할 수 있습니다.
예제 코드
public class UncaughtExceptionHandlerTest {
public static void main(String[] args) throws Exception {
Thread.setDefaultUncaughtExceptionHandler(new MyHandler());
throw new Exception("Test Exception");
}
private static final class MyHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("The Exception Caught: " + e);
}
}
}
실행 결과
The Exception Caught: java.lang.Exception: Test Exception
위 예제에서는 setDefaultUncaughtExceptionHandler() 메서드를 통해 사용자 정의 핸들러인 MyHandler를 등록했습니다. 메인 스레드에서 예외가 발생하면 JVM이 자동으로 uncaughtException() 메서드를 호출하여 예외를 가로채고, 지정된 로직(여기서는 콘솔 출력)을 실행한 후 프로그램이 종료됩니다. 이러한 방식은 애플리케이션 전역의 예외 로깅, 크래시 리포트 수집 등에 유용하게 활용됩니다.