JavaSpring异常处理

zlwx9yxi  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(373)

我有多个控制器,它们的异常在 ControllerAdvice . 所有控制器都使用公共异常类型(如 HttpClientException, DBException 等)。但是有一个特定的控制器,它应该以不同的方式处理异常。
在我当前的实现中,这个特定控制器的所有方法都用try-catch和throw Package CustomException 如有例外。然后,在 ControllerAdvice 我处理这种类型的异常。
但是,我想处理中的所有异常 ControllerAdvice 以及摆脱 CustomException 并尝试控制器方法中的catch。
有没有办法在异常通知中找到源控制器的名称?我可以检查它并以不同的方式处理异常。或者有其他解决办法?

dphi5xsq

dphi5xsq1#

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

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

}

正如在最后一块中提到的,您可以从抛出异常的位置获取类名,并利用该名称分支出您的内容。

相关问题