Spring boot中统一异常的方式


在日常项目开发过程中,异常总是在所难免,

在这里插入图片描述
这样的提示对用户来说非常不友好,我们可以采用以下方式对异常统一处理

实现方式

有两种方式可以实现异常的统一处理

  1. 使用@ControllerAdvice和@ExceptionHandler注解
  2. 实现ErrorController接口的方式

准备相关类

统一结果类

建一个统一返回类,用以统一返回后台信息格式,方便前端经行处理

package com.lyp.demoexceptionhandle.result;

import java.util.StringJoiner;

/**
 * @Author: 李宜鹏
 * @Date: 2020/4/26 0:13
 */
public class Result {

    private int code;
    private String message;
    private Object data;

    public Result() {
    }

    public Result(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return new StringJoiner(", ", Result.class.getSimpleName() + "[", "]")
                .add("code=" + code)
                .add("message='" + message + "'")
                .add("data=" + data)
                .toString();
    }

用于测试的Controller

package com.lyp.demoexceptionhandle.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 测试Controller
 * @Author: 李宜鹏
 * @Date: 2020/4/26 0:06
 */

@RestController
public class TestController {

    /**
     * 测试方法
     * @param name
     * @return
     */
    @RequestMapping("/test")
    public String test(String name) {
        return name.toString();
    }
}

第一种:使用@ControllerAdvice和@ExceptionHandler注解

package com.lyp.demoexceptionhandle.exception;

import com.lyp.demoexceptionhandle.result.Result;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

/**
 * @Author: 李宜鹏
 * @Date: 2020/4/26 0:01
 * 全局异常处理
 */
@ControllerAdvice
public class GlobalExceptionHandler {

    @ResponseBody
    @ExceptionHandler(NullPointerException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public Result NullPointerException() {
        return new Result(500, "空指针异常");
    }

    @ResponseBody
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public Result Exception() {
        return new Result(500, "其他异常错误");
    }
}

统一异常处理后页面提示信息如下:
在这里插入图片描述
这样就可以在前端做相应的处理了

第二种:实现ErrorController接口

package com.lyp.demoexceptionhandle.exception;

import com.lyp.demoexceptionhandle.result.Result;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Author: 李宜鹏
 * @Date: 2020/4/26 23:05
 */
@RestController
public class GlobalErrorController implements ErrorController {

    private static final String ERROR_PATH = "/error";

    @ResponseBody
    @RequestMapping(path = ERROR_PATH )
    public Result error(HttpServletRequest request, HttpServletResponse response){
        Result result = new Result(500,"HttpErrorController error:"+response.getStatus());
        return result;
    }

    /**
     * Returns the path of the error page.
     *
     * @return the error path
     */
    @Override
    public String getErrorPath() {
        return GlobalErrorController.ERROR_PATH;
    }
}

统一处理后页面提示信息如下:
在这里插入图片描述

两种方式的区别

两种方式都可以实现对后台异常的统一处理

使用@ControllerAdvice和@ExceptionHandler注解的方式可以根据后台的具体异常经行处理,如:NullPointerException、IndexOutOfBoundsException…根据报错的异常类型来进行异常的统一处理

使用实现ErrorController接口的方式可以根据HttpServletResponse的状态码,如:404、405、500…等状态码来经行异常的统一处理

代码地址

https://github.com/Is-LYP/demo-exception-handle

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值