Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Cách xử lý ngoại lệ bằng UncaughtExceptionHandler trong Java

UncaughtExceptionHandler là interface bên trong lớp Thread. Khi luồng chính (main thread) sắp kết thúc do ngoại lệ không bắt (uncaught exception), JVM sẽ gọi UncaughtExceptionHandler của luồng đó để có cơ hội xử lý lỗi (ghi log ra file, upload log lên server) trước khi bị kill. Có thể thiết lập Default Exception Handler cho tất cả ngoại lệ không xử lý. Được giới thiệu từ Java 5.

Handler được thiết lập bằng phương thức tĩnh của java.lang.Thread:

public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ueh)

Cần cung cấp triển khai interface Thread.UncaughtExceptionHandler, chỉ có một phương thức:

Cú pháp

@FunctionalInterface 
public interface UncaughtExceptionHandler { 
    void uncaughtException(Thread t, Throwable e); 
}

Ví dụ minh họa

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); 
        } 
    } 
}

Kết quả đầu ra

The Exception Caught: java.lang.Exception: Test Exception

Ứng dụng thực tế

  • Ghi log ngoại lệ không bắt ra file/log server trước khi ứng dụng crash.
  • Gửi báo lỗi tự động (crash reporting) đến dịch vụ như Sentry, Bugsnag.
  • Dọn dẹp tài nguyên khẩn cấp (đóng kết nối, flush buffer).
  • Hiển thị dialog thân thiện cho người dùng thay vì stack trace thô.

Lưu ý

  • Chỉ xử lý được unchecked exception (RuntimeException, Error) không bị bắt ở đâu.
  • Checked exception phải được khai báo throws hoặc try-catch, không đi đến UncaughtExceptionHandler.
  • Có thể set handler cho từng thread riêng bằng thread.setUncaughtExceptionHandler().