java处理异常的全局捕获方法

在 Java 中,实现异常的全局捕获可以通过多种方式,最常见的方法是使用 @ControllerAdvice 结合 @ExceptionHandler,适用于 Spring MVC 应用。此外,还可以使用 Thread.setDefaultUncaughtExceptionHandler 来处理未捕获的异常。以下是几种常见的实现方式:

1. 使用 Spring 的 @ControllerAdvice


如果你使用 Spring 框架,可以通过 @ControllerAdvice 来定义全局异常处理器。

步骤:


    创建一个全局异常处理器类:


java


import org.springframework.http.HttpStatus;

import org.springframework.http.ResponseEntity;

import org.springframework.web.bind.annotation.ControllerAdvice;

import org.springframework.web.bind.annotation.ExceptionHandler;


@ControllerAdvice

public class GlobalExceptionHandler {


    @ExceptionHandler(Exception.class)

    public ResponseEntity handleAllExceptions(Exception ex) {

        return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);

    }


    // 可以添加更多的异常处理方法

    @ExceptionHandler(NullPointerException.class)

    public ResponseEntity handleNullPointerException(NullPointerException ex) {

        return new ResponseEntity<>("Null pointer exception occurred", HttpStatus.BAD_REQUEST);

    }

}


    在 Spring Boot 应用中启用:


只需将该类放在 Spring Boot 应用的组件扫描路径中,Spring 会自动注册它。

2. 使用 Thread.setDefaultUncaughtExceptionHandler


对于非 Web 应用或需要处理多线程异常的情况,可以使用 Thread.setDefaultUncaughtExceptionHandler。

示例:


java


public class GlobalExceptionHandler implements Thread.UncaughtExceptionHandler {

    @Override

    public void uncaughtException(Thread t, Throwable e) {

        System.out.println("Thread " + t.getName() + " threw an exception: " + e.getMessage());

        // 可以记录日志或发送通知

    }


    public static void main(String[] args) {

        Thread.setDefaultUncaughtExceptionHandler(new GlobalExceptionHandler());


        // 触发异常

        Thread thread = new Thread(() -> {

            throw new RuntimeException("Test exception");

        });

        thread.start();

    }

}


3. 使用 @RestControllerAdvice(针对 RESTful API)


对于 RESTful API,可以使用 @RestControllerAdvice,它会自动将返回值转换为 JSON。


java


import org.springframework.http.HttpStatus;

import org.springframework.http.ResponseEntity;

import org.springframework.web.bind.annotation.RestControllerAdvice;

import org.springframework.web.bind.annotation.ExceptionHandler;


@RestControllerAdvice

public class GlobalRestExceptionHandler {


    @ExceptionHandler(Exception.class)

    public ResponseEntity handleAllExceptions(Exception ex) {

        return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);

    }

    

    @ExceptionHandler(IllegalArgumentException.class)

    public ResponseEntity handleIllegalArgumentException(IllegalArgumentException ex) {

        return new ResponseEntity<>("Illegal argument exception: " + ex.getMessage(), HttpStatus.BAD_REQUEST);

    }

}


选择合适的方法


选择异常处理方法时,可以根据应用类型和需求来决定。对于 Spring 应用,@ControllerAdvice 和 @RestControllerAdvice 是推荐的方法,而对于多线程应用,使用 UncaughtExceptionHandler 会更为有效。

请使用浏览器的分享功能分享到微信等