如何解决Java Spring异常处理
我有多个控制器,其异常在ControllerAdvice
中处理。
所有控制器都使用常见的异常类型(例如HttpClientException,DBException
等)。
但是,有一个特定的控制器可以对异常进行不同的处理。
在我当前的实现中,此特定控制器的所有方法都包裹有try-catch并在发生任何异常的情况下抛出CustomException
。然后,在ControllerAdvice
中处理这种类型的异常。
但是,我想处理ControllerAdvice
中的所有异常,并摆脱CustomException
并尝试在控制器方法中进行捕获。
是否有任何方法可以在异常建议中找出源控制器名称?我可以检查它并以不同方式处理异常。 或者也许存在其他解决方案?
解决方法
除了控制器建议之外,您还可以为自定义异常提供处理程序,如下所示。
@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: {}",HttpStatus.NOT_FOUND);
}
@ExceptionHandler(Exception.class)
public final ResponseEntity<ApiResponseDTO> manageException1(Exception ex) {
log.error("Error in Common Exception Handler: {}",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);
}
}
如上一节所述,您可以从引发此异常的位置获取类名称,并利用该名称分支您的内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。