全局异常控制

1 场景描述:
  在平常的项目开发中,经常会看到一些有意思的事情。比如: 请求一个接口数据时,返回的数据是一大堆看不懂的英文串串。没错,就是各种异常。难道猿猿们没有想过,自己都不愿意看到的串串,让前端看、让操作人员看???
  所以,一名伟大的猿,应该学会打碎牙,往肚子里咽。其它人看到的只是友好的笑脸。
  此时,全局异常控制,你值得拥有!
2 项目架构描述:
   项目框架: SpringBoot
2.1 使用的注解:
    @ControllerAdvice
     参数 basePackages 控制异常的范围;
    @ExceptionHandler
    @ControllerAdvice
示例:

package com.ndx.config.Intercepter;

import javax.servlet.http.HttpServletResponse;
import com.ndx.config.exception.ErrorPageException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ndx.common.ServerResponse;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@ControllerAdvice(basePackages={"com.ndx.controller"})
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ServerResponse<String> exceptionHandler(RuntimeException e, HttpServletResponse response) {
        log.error("全局检测到异常:",e);
        return ServerResponse.createByErrorMessage("内部错误!");
    }

    @ExceptionHandler(IndexOutOfBoundsException.class)
    @ResponseBody
    public  ServerResponse<String> exceptionHandler(IndexOutOfBoundsException e, HttpServletResponse response) {
        log.error("全局拦截 Cotroller 数组越界异常:", e);
        return ServerResponse.createByErrorMessage("数组越界错误!");
    }

    @ExceptionHandler(NullPointerException.class)
    @ResponseBody
    public  ServerResponse<String> exceptionHandler(NullPointerException e, HttpServletResponse response) {
        log.error("全局拦截 Cotroller 空指针异常:", e);
        return ServerResponse.createByErrorMessage("空指针异常误!");
    }

    /**
     * 处理自定义异常
     * 如果某些业务处理,当数据返回错误时,
     * 需要跳转页面,可以在这里封装好数据信息
     * 提供给前端
     */
    @ExceptionHandler(ErrorPageException.class)
    @ResponseBody
    public  ServerResponse exceptionHandler(ErrorPageException e, HttpServletResponse response) {
        log.error("全局拦截 Cotroller 错误页面异常:", e);
        Map<String,String> map = new HashMap<>();
        map.put("url","/error.html");
        map.put("msg","休息,休息~~~~~~");
        return ServerResponse.createByErrorCodeMessage(10,"error",map);
    }
}

2.2 实现 HandlerExceptionResolver 接口:

package com.ndx.config.Intercepter;

import com.ndx.common.ResponseCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @auth zhangmj
 * @date 2019/1/19 3:08
 */
@Slf4j
@Component
public class ExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        log.error("{} Exception",httpServletRequest.getRequestURI(),e);
        ModelAndView modelAndView = new ModelAndView(new MappingJackson2JsonView());

        modelAndView.addObject("status", ResponseCode.ERROR.getCode());
        modelAndView.addObject("msg","接口异常,详情请查看日志信息");
        modelAndView.addObject("data",e.toString());
        return modelAndView;
    }
}

2.3 区别

  注解 ExceptionHandler 优先级别高于 HandlerExceptionResolver 接口;
  注解使用起来,更见简洁,配置更加方便;
  …
  …

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值