在面试过程中面试官通常会问,你们项目中处理异常是怎么处理的?
源码讲解https://blog.csdn.net/qq_36665310/article/details/106899947
异常处理方式一. @ExceptionHandler
异常处理方式二. 实现HandlerExceptionResolver接口
异常处理方式三. @ControllerAdvice+@ExceptionHandler
三种方式比较说明
说完这个就可以说我在以前的公司都是一路向上抛,然后我们会自定义异常类来实现统一异常处理,这种方式实现比较简单直接.主要是用@ControllerAdvice注解加在类上,
在方法上加一个@ExceptionHandler指定异常类型的字节码,如果一旦出现异常这个异常类就能捕获到异常,如果符合的设置字节码类型,那就会执行该方法的逻辑代码.
实现方式1(@ExceptionHandler):
@ControllerAdvice
public class BaseExceptionHandler {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result error(Exception e){
e.printStackTrace();
return new Result(false, StatusCode.ERROR, "执行出错");
}
}
注解解释:
@ControllerAdvice : 声明此类是一个增强类
@ExceptionHandler(value = Exception.class) :指定需要捕获的异常的字节码
捕获自定义异常
我们的异常信息类UserRuntimeException并继承RuntimeException:
package com.tang.xuethead.Controller;
/**
*
* @author Sir.tang
* @return 自定义异常类
* @exception
* @date 2021/4/23 11:00
*/
public class UserRuntimeException extends RuntimeException{
/*
1. 尽量为每一个需要序列化的类自定义serialVersionUID值,这样可避免因为Class中字段的修改而带来的反序列化异常。
2. 尽量不要修改序列化类中的字段类型,如果一定要修改,请重新序列化后再反序列化。
3. 如果要为序列化的类中忽略某个字段,可添加transient关键字
*/
private static final long serialVersionUID = 1L; /序列化
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public UserRuntimeException(String id, String message) {
super(message);
this.id = id;
}
}
//自定义异常
@ExceptionHandler(UserRuntimeException.class)
@ResponseBody
public Map<String, Object> TangExceptions(UserRuntimeException ex){
result.put("id", ex.getId());
result.put("msg", ex.getMessage());
return result;
}
触发自定义异常
//前台传入id过来
@GetMapping("/{id}/{name}")
public String getUserById(@PathVariable String id,@PathVariable String name) {
if(!id.equals("123456")) {
//触发自定义异常类
throw new UserRuntimeException(id,"id not found");
}
return id+name;
}
如果程序走这个异常被我们捕获 就会执行下面的代码逻辑返回一个Result 对象到前端,进行展示.
网友评论