统一异常处理,自定义异常处理

2020-07-15  本文已影响0人  任笙_8b8c
在面试过程中面试官通常会问,你们项目中处理异常是怎么处理的?
源码讲解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 对象到前端,进行展示.

上一篇 下一篇

猜你喜欢

热点阅读