728x90

Java UncaughtExceptionHandler 란?

스레드에서 발생한 예외를 처리하는 인터페이스

Java에서는 스레드 내부에서 발생한 예외(Exception)가 잡히지 않으면(uncaught),

해당 스레드는 종료되며 예외가 콘솔에 출력됨.

이때 UncaughtExceptionHandler를 사용하면 스레드에서 발생한 예외를 감지하고 적절한 처리를 수행할 수 있다.


UncaughtExceptionHandler 인터페이스

UncaughtExceptionHandler는 Java의 내부 인터페이스로, Thread 클래스에 포함되어 있다.

void uncaughtException(Thread t, Throwable e);
  • t: 예외가 발생한 스레드 객체
  • e: 발생한 예외 객체

setUncaughtExceptionHandler()

스레드에 UncaughtExceptionHandler를 등록하여 예외 처리 설정

void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh);
  • 특정 스레드에서 발생한 예외를 감지하고, 원하는 방식으로 처리할 수 있음.

예제1: 기본적으로 예외가 발생하면 프로그램이 종료됨

UncaughtExceptionHandler 없이 실행하면 스레드 예외가 발생하면 콘솔에 출력되고 종료됨.

class ExceptionThread extends Thread { 
    public void run() {
    	throw new RuntimeException("스레드에서 예외 발생!"); 
    } 
    
    public static void main(String[] args) {
    	ExceptionThread thread = new ExceptionThread(); 
        thread.start();
    } 
}

실행 결과

Exception in thread "Thread-0" java.lang.RuntimeException: 스레드에서 예외 발생! 
at ExceptionThread.run(ExceptionThread.java:4)

 

예외 발생 시 Thread-0이 즉시 종료됨, 다른 스레드는 영향을 받지 않음.


예제2: UncaughtExceptionHandler를 사용한 예외 처리

발생한 예외를 감지하고 원하는 방식으로 처리 가능

class ExceptionHandlerExample extends Thread {
    public void run() {
        throw new RuntimeException("스레드에서 예외 발생!");
    }

    public static void main(String[] args) {
        ExceptionHandlerExample thread = new ExceptionHandlerExample();

        // 예외 처리 핸들러 설정
        thread.setUncaughtExceptionHandler((t, e) -> {
            System.out.println("스레드 [" + t.getName() + "]에서 예외 발생: " + e.getMessage());
        });

        thread.start();
    }
}

실행 결과

스레드 [Thread-0]에서 예외 발생: 스레드에서 예외 발생!
 

프로그램이 종료되지 않고 예외를 정상적으로 처리


예제3: ThreadGroup을 사용하여 모든 스레드의 예외 처리

여러 개의 스레드에서 예외가 발생할 경우, ThreadGroup을 활용하여 일괄 처리 가능

class MyThread extends Thread {
    public void run() {
        throw new RuntimeException("스레드에서 예외 발생!");
    }
}

public class GlobalExceptionHandler {
    public static void main(String[] args) {
        // 전역 예외 처리 핸들러 설정
        Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
            System.out.println("전역 핸들러: [" + t.getName() + "]에서 예외 발생 - " + e.getMessage());
        });

        // 여러 스레드 실행
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread();

        t1.start();
        t2.start();
        t3.start();
    }
}
 

실행 결과

전역 핸들러: [Thread-0]에서 예외 발생 - 스레드에서 예외 발생! 
전역 핸들러: [Thread-1]에서 예외 발생 - 스레드에서 예외 발생! 
전역 핸들러: [Thread-2]에서 예외 발생 - 스레드에서 예외 발생!
 

모든 스레드에서 발생하는 예외를 전역적으로 처리 가능.


메서드설명

setUncaughtExceptionHandler(UncaughtExceptionHandler handler) 특정 스레드에서 발생한 예외를 감지하여 처리
void uncaughtException(Thread t, Throwable e) 예외 발생 시 실행되는 핸들러 메서드
Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler handler) 모든 스레드에서 발생한 예외를 한 번에 처리

 

결론: UncaughtExceptionHandler를 활용하면 멀티스레딩 환경에서 예외를 효과적으로 관리할 수 있다

728x90
복사했습니다!