0

我有多个控制器,它们的异常在ControllerAdvice. 所有控制器都使用常见的异常类型(如HttpClientException, DBException等)。但是有一个特定的控制器,应该以不同的方式处理异常。

在我当前的实现中,这个特定控制器的所有方法都用 try-catch 包装,并CustomException在出现任何异常时抛出。然后,在ControllerAdvice我处理这种类型的异常。

但是,我想在控制器方法中处理所有异常ControllerAdvice以及摆脱CustomException和尝试捕获。

有没有办法在异常建议中找出源控制器名称?我可以检查它并以不同的方式处理异常。或者也许存在其他一些解决方案?

4

1 回答 1

0

在您的控制器建议中,您可以为您的自定义异常提供处理程序,如下所示。

@ControllerAdvice
public class CustomGlobalExceptionHandler {
    @ExceptionHandler(CustomException.class)
    public final ResponseEntity<ApiResponseDTO> manageException(CustomException ex) {
        log.error("Error in CustomException: {}", ex.getMessage(), ex);
        ApiResponseDTO error = ApiResponseDTO.builder()
                .message(ex.getMessage())
                .result(0)
                .build();
        return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
    }

    @ExceptionHandler(CustomException1.class)
    public final ResponseEntity<ApiResponseDTO> manageException1(CustomException1 ex) {
        log.error("Error in CustomException1: {}", ex.getMessage(), ex);
        ApiResponseDTO error = ApiResponseDTO.builder()
                .message(ex.getMessage())
                .result(0)
                .build();
        return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
    }

    @ExceptionHandler(Exception.class)
    public final ResponseEntity<ApiResponseDTO> manageException1(Exception ex) {
        log.error("Error in Common Exception Handler: {}", ex.getMessage(), ex);
        StackTraceElement[] ste = ex.getStackTrace();
        String className=ste[ste.length - 1].getClassName();
        System.out.println(className);
        if(className.equalsIgnoreCase("com.a")){
            System.out.println("Do A related stuff");
        }else{
            System.out.println("Do B related stuff");
        }
        ApiResponseDTO error = ApiResponseDTO.builder()
                .message(ex.getMessage())
                .result(0)
                .build();
        return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
    }

}

如上一节所述,您可以从引发此异常的位置获取类名,并利用该名称来扩展您的内容。

于 2020-08-20T08:50:16.793 回答