SpringBoot 全局异常处理(可自定义全局异常返回页面),并打日志

  • 为什么要配置全局异常?

    • 不配全局服务端报错场景 1/0、空指针等 返回前端错误代码 用户体验不佳
  • 配置好处

    • 统一的错误页面或者错误码
    • 对用户更友好
  • Springboot 怎么在项目中配置全局异常

    • 类添加注解

      • @ControllerAdvice,如果需要返回json数据,则方法需要加@ResponseBody
      • @RestControllerAdvice, 默认返回json数据,方法不需要加@ResponseBody
    • 方法添加处理器

      • 捕获全局异常,处理所有不可知的异常
      • @ExceptionHandler(value=Exception.class)
      • 注释:Exception.class  可自定义异常

完整代码如下

//或 @ControllerAdvice + 方法上加@ResponseBody 返回json数据
@RestControllerAdvice
public class GlobalExceptionHandler  {

protected static Log log = LogFactory.getLog(com.blockchain.controller.base.BaseController.class);

    @Autowired
    private MemberService memberService;

    @ExceptionHandler(Exception.class) //或者自定义异常 BusinessException.class
    public MessageResult exceptionResult(HttpServletRequest request, HttpServletResponse response, Exception e) {
        //获得请求人id
        HttpSession session = request.getSession();
        AuthMember user = (AuthMember) session.getAttribute(SysConstant.SESSION_MEMBER);
        Member member = null;
        if (ObjectUtils.isEmpty(user)) {
            String token = request.getHeader("access-auth-token");
            if (StringUtils.isEmpty(token)) {
                token = request.getHeader("x-auth-token");
            }
            if (!ObjectUtils.isEmpty(token)){
                user = (AuthMember) session.getAttribute(token);
                if (ObjectUtils.isEmpty(user)){
                    member = memberService.loginWithToken(token, request.getRemoteAddr(),"");
                }
            }
        }
        Integer memberId=null;
        if (!ObjectUtils.isEmpty(user)){
            memberId=user.getUserId();
        }else if(!ObjectUtils.isEmpty(member)){
            memberId=member.getId();
        }
        //获得请求参数
        Map<String, String[]> parameterMap = request.getParameterMap();
        String json= JSONObject.toJSON(parameterMap).toString();
        log.error("全局异常:"+""+"请求方法:"+request.getMethod()+",请求接口:"+request.getRequestURI()+",请求人id:"+memberId+",请求参数:"+"["+json+"]",e);
       return error(-1,"服务器内部错误 请联系管理员");
    }

BusinessException.class  //自定义异常

public class BusinessException extends RuntimeException {
    public final static int DEFAULT_BIZ_ERROR_CODE = 9;
    public final static int DEFAULT_SYS_ERROR_CODE = 99;

    protected int errorCode = DEFAULT_BIZ_ERROR_CODE; // 错误码默认为9

    protected String errorMessage = null; // 错误消息默认为null
    private String[] args = null;

    public BusinessException(int errorCode) {
        super("");
        this.errorCode = errorCode;
    }

    public BusinessException(int errorCode, String[] args) {
        super("");
        this.errorCode = errorCode;
        this.args = args;
    }

    public BusinessException(int errorCode, String arg ) {
        super("");
        this.errorCode = errorCode;
        this.args =new String[]{ arg};
    }

    public BusinessException(MessageCode message) {
        super("");
        this.errorCode = message.getValue();
        this.errorMessage = message.getCnName();
    }

    public String[] getArgs() {
        return args;
    }

    public int getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(int errorCode) {
        this.errorCode = errorCode;
    }


    public String getErrorMessage() {

        return errorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }


}

使用SpringBoot自定义异常和错误页面跳转

  • 返回自定义异常界面,需要引入thymeleaf依赖(非必须,如果是简单的html界面则不用)
<dependency>
	   <groupId>org.springframework.boot</groupId>
	   <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
  • resource目录下新建templates,并新建error.html
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("error.html");
modelAndView.addObject("msg", e.getMessage());
return modelAndView;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值