java中的全局异常处理(代码片段)

攻城狮Chova 攻城狮Chova     2023-02-19     425

关键词:

全局异常处理

  • ErrorController接口@ControllerAdvice注解比较:
    • 相同点:
      • 两者都是Spring项目中的全局异常处理方式
    • 不同点:
      • 捕获异常位置不同:
        • ErrorController接口捕获全局所有的异常,包括控制器方法中抛出的异常
        • @ControllerAdvice注解只能捕获控制器方法中抛出的异常 .@Controller注解无法捕获Filter, 拦截器,请求路径等位置抛出的异常
      • 实现方式不同:
        • ErrorController接口是基于跳转页面的.如果有异常发生,就会跳转到 /error页面
        • @ControllerAdvice是基于AOP
    • 如果项目中两者同时存在,那么 @ControllerAdvice注解就处理控制器方法抛出的异常 ,Controller接口就处理未进入控制器方法的异常

SpringBoot的全局异常处理

  • SpringBoot中全局异常默认处理方式是接口ErrorController的方式:
    • 跳转/error路径:
      • 如果请求发生异常 ,Tomcat中的StandardHostValve类的custom方法会重定向到 /error路径
      • 请求将会交由SpringMVC中的DispatcherServlet类进行处理
    • 定位BasicErrorController:
      • DispatcherServlet类将 /error请求和BasicErrorController中的方法进行对应
        • 如果是html的请求方式 ,/error定位到errorHtml() 方法
        • 如果是json的请求方式 ,/error定位到error() 方法
  • SpringBoot中自定义全局异常处理类:
    • SpringBoot默认的错误页不够友好,可以自定义异常处理类,继承BasicErrorController类,重写BasicController类中的errorHtml() 方法和error() 方法
@RestController
public class CustomErrorController extends BasicErrorController 

	@Autowired
	public CustomErrorController(ErrorAttributes errorAttributes, ServerProperties serverProperties, List<ErrorViewResolver> errorViewResolvers) 
		super(errorAttributes, serverProperties.getError(), errorViewResolvers);
	

	@Override
	public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) 
		HttpStatus status = getStatus(request);
		Map<String, Object> model = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.TEXT_HTML));
		ModelAndView modelAndView = new ModelAndView("customeErrorPage", model, status);
		return modelAndView;
	

	@Override
	public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) 
		Map<String, Object> body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL));

		Map<String, Object> responseBody = new HashMap<>(8);
		responseBody.put("success", false);
		responseBody.put("code", body.get("status"));
		responseBody.put("message", body.get("error"));

		return new ResponseEntity<>(responseBody, HttpStatus.OK);
	

@ControllerAdvice注解

  • @ControllerAdvice注解的执行顺序
  • 根据请求的执行顺序可知:
    • @ControllerAdvice注解可以捕获搭配aspectcontroller方法中的异常
    • @ControllerAdvice注解不能捕获到filterinterceptor方法中中的异常
  • 使用 @ControllerAdvice注解和 @ExceptionHandler处理异常:
/**
 * 自定义异常
 */
 @Data
 public class ServiceException extends RuntimeException 
 	
 	private Integer code;

	public ServiceException(Integer code, String message) 
		super(message);
		this.code = code;
	
 
/**
 * 处理异常
 */
 @Slf4j
 @RestControllerAdvice(annotations = RestController.class, Controller.class)
 public class GlobalExceptionHandler 
 	
 	@ExceptionHandler(ServiceException.class)
 	@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
 	public Result handleException(ServciceException exception) 
 		log.error(exception.getMessage());
 		return Result.buildFailure(exception.getCode(), exception.getMessage());
 	
 
@Data
public class User 
	
	@NotBlank(message = "用户姓名必须提交!")
	private String name;

/**
 * 异常处理实例
 */
 @Controller
 @RequestMapping("/exception")
 public class MethodExceptionController 
 	
 	@GetMapping("/user")
 	@ResponseBody
 	public Result getName(@Valid @RequestParam User user) 
 		return Result.buildSuccess(user);
 	
 

java中的全局异常处理(代码片段)

Java中的全局异常处理全局异常处理SpringBoot的全局异常处理@ControllerAdvice注解全局异常处理ErrorController接口和@ControllerAdvice注解比较:相同点:两者都是Spring项目中的全局异常处理方式不同点:捕获异常位置不同:ErrorController接口... 查看详情

java全局异常捕获处理(代码片段)

为了项目的正常运行中,异常捕获,记录也是非常重要的,方便我们排查问题,定位问题定义异常为了方便定位异常,自定义了几种异常类,方便我们快速定位异常。基类publicclassHttpExceptionextendsRuntimeExceptionprotectedStr... 查看详情

uwp中的全局异常处理(代码片段)

原文:UWP中的全局异常处理问题在开发一款应用的过程中,我们开发者很难考虑到所有问题,往往会忘记处理一些可能发生的异常。随之而来的结果就是用户使用过程中接连不断的崩溃。所以,我们有必要处理所有未被我们处理... 查看详情

kittycloud(http/rpc)的全局异常处理(代码片段)

...常处理用的也越来越广泛,今天跟大家来聊一聊KittyCloud中的全局异常是如何处理的?为什么要使用全局异常处理呢?使用全局异常处理后,我们不需要定义固定类型的返回值,当业务代码报错的时 查看详情

kittycloud(http/rpc)的全局异常处理(代码片段)

...常处理用的也越来越广泛,今天跟大家来聊一聊KittyCloud中的全局异常是如何处理的?为什么要使用全局异常处理呢?使用全局异常处理后,我们不需要定义固定类型的返回值,当业务代码报错的时 查看详情

kittycloud(http_rpc)的全局异常处理(代码片段)

...常处理用的也越来越广泛,今天跟大家来聊一聊KittyCloud中的全局异常是如何处理的?为什么要使用全局异常处理呢?使用全局异常处理后,我们不需要定义固定类型的返回值,当业务代码报错的时候直接 查看详情

uwp中的全局异常处理(代码片段)

...将错误直接展示在用户界面上。解决首先,我们打开项目中的App.xaml.cs,修改以下代码:publicApp()this.InitializeComponent();this.Suspending+=OnSuspending;UnhandledException+=OnUnhandledException;在此,我们为UnhandledException事件添加了处理方法OnUnhandledE... 查看详情

springmvc全局异常controlleradviceexceptionhandler(代码片段)

springmvc框架采用的是统一、全局的异常处理。把controller中的所有异常处理都集中到一个地方。采用的是AOP的思想、把业务逻辑和异常处理代码分开,降低耦合。Springmvc中的异常处理主要用到以下两个注解@ControllerAdvice和... 查看详情

springmvc全局异常controlleradviceexceptionhandler(代码片段)

springmvc框架采用的是统一、全局的异常处理。把controller中的所有异常处理都集中到一个地方。采用的是AOP的思想、把业务逻辑和异常处理代码分开,降低耦合。Springmvc中的异常处理主要用到以下两个注解@ControllerAdvice和... 查看详情

5.全局异常捕捉(代码片段)

在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢?新建一个类GlobalDefaultExceptionHandler,在class注解上@ControllerAdvice,在方法上注解上@ExceptionHandler(value=Exception.class),具体代码如下: com.kfit.base.ex... 查看详情

springboot结合全局异常处理之登录注册验证(代码片段)

...离开发,所以要求返回JSON数据。方法有很多,这觉得用全局异常处理比较容易上手全局异常处理首先来创建一个sprIngboot的web项目或模块,目录结构如下实体类User.java@DatapublicclassUserprivateStringuserName;privateStringpasswo 查看详情

java中的异常处理机制(代码片段)

文章目录聊聊Java中的异常处理机制概念异常处理抛出异常异常跟踪栈:异常处理步骤:1.捕获异常2.处理异常3.回收资源Java的异常处理接口关于finallyfinally是无条件执行的吗?在finally中return会发生什么?聊聊Java中... 查看详情

全局异常处理(代码片段)

...  为了将异常处理代码和业务代码分离,需要配置一个全局异常处理处理器,全局异常处理器整个系统只能有一个,使用方法:需要实现一个接口HandlerExceptionResolver、需要在springmvc中配置二、准备环境  log4j.properties属性文... 查看详情

springboot2.0系列教程springboot框架添加全局异常处理(代码片段)

...互联网时代,我们所开发的应用大多是直面用户的,程序中的任何一点小疏忽都可能导致用户的流失,而程序出现异常往往又是不可避免的,所以我们需要对异常进行捕获,然后给予相应的处理,来减少程序异常对用户体验的影... 查看详情

springboot系列springboot全局异常处理数据校验(代码片段)

五、SpringBoot全局异常处理、数据校验5.1SpringBoot异常处理5.1.1Controller层局部异常处理5.1.2基于@ControllerAdvice注解的Controller层的全局异常处理5.1.3HandlerExceptionResolver处理异常解析器5.2SpringBoot数据校验5.1SpringBoot异常处理我们知道在... 查看详情

springboot学习笔记:全局异常处理(代码片段)

SpringBoot可以使用@ControllerAdvice注解进行全局异常的处理,这样可以方便统一对异常的处理返回1.处理常见异常首先我们需要确定一个异常处理统一返回的格式@DatapublicclassBaseResult/***返回code,成功为0,失败为-1*/privateSt... 查看详情

springboot全局异常处理(代码片段)

自定义异常类@EqualsAndHashCode(callSuper=true)@DatapublicclassCustomExceptionextendsRuntimeExceptionprivateIntegercode;publicCustomException(Stringmessage,Integercode)super(message);this.code& 查看详情

java的异常处理机制(代码片段)

...提供了相对完善的异常处理机制。我们首先介绍一下Java中的异常。介绍Java中的异常异常是程序在运行过程中出现的程序异常事件,异常会中断正在执行的正常指令流。Java中的异常分为两大类:Exception和Error。下面是Exception和Erro... 查看详情