全局异常是无法处理Filter过滤器的异常信息

Tomcat容器的请求路径是:从过滤器后再到拦截器的。如果过滤器异常,拦截器压根就没法执行方法。

如果想了解完整Tomcat容器结构,请跳转查看:

全局异常拦截说明

@ExceptionHandler支持多个异常数组

但是多个@ExceptionHandler的异常类信息不允许重复,切记!

@ResponseStatus(value = HttpStatus.BAD_REQUEST) 用于指定响应码。

当然也可以在方法的返回值设为ResponseEntity,在此对象指定响应吗。

全局异常拦截器代码

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.CannotAcquireLockException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.HttpRequestMethodNotSupportedException;
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;

import javax.servlet.http.HttpServletRequest;

/**
 * @Author :zanglk
 * @DateTime :2021/3/11 13:54
 * @Description :AOP 思想 统一全局异常处理。MVC提供一个@ControllerAdvice注解去处理异常
 * @Notes :
 * 特别说明
 * 1、@ExceptionHandler支持多个异常数组。但是多个@ExceptionHandler的异常类信息不允许重复,切记!
 * 2、@ResponseStatus(value = HttpStatus.BAD_REQUEST) 用于指定响应码。当然也可以在方法的返回值设为ResponseEntity,在此对象指定响应吗。
 */

@ControllerAdvice // 如果需要关闭全局异常拦截,直接注释此注解即可
public class GlobalExceptionHandler {
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);


    /**
     * 处理非法参数异常
     *
     * @param req 请求:可以记录一些传参的内容。你可以自定义日志与向响应的信息,只是当前没用到。
     * @param e   异常对象。
     * @return 响应实体
     */
    @ExceptionHandler(value = IllegalStateException.class)
    @ResponseBody
    public ResponseEntity bizExceptionHandler(HttpServletRequest req, IllegalStateException e) {
        logger.error("接收了一个非法参数的异常:{}", e.getMessage());
        return ResponseEntity.badRequest().body("数据传输错误,导致非法参数异常,请联系管理员处理!");
    }

    /**
     * 处理空指针的异常
     *
     * @param req 请求:可以记录一些传参的内容。你可以自定义日志与向响应的信息,只是当前没用到。
     * @param e   异常对象。
     * @return 响应实体
     */
    @ExceptionHandler(value = NullPointerException.class)
    @ResponseBody
    public ResponseEntity exceptionHandler(HttpServletRequest req, NullPointerException e) {
        logger.error("接收了一个空指针的异常:{}", e.getMessage());
        return ResponseEntity.badRequest().body("空指针异常,请联系管理员处理!");
    }

    /**
     * 数字格式异常异常处理
     *
     * @param req 请求:可以记录一些传参的内容。你可以自定义日志与向响应的信息,只是当前没用到。
     * @param e   异常对象。
     * @return 响应实体
     */
    @ExceptionHandler(value = NumberFormatException.class)
    @ResponseBody
    public ResponseEntity numberFormatException(HttpServletRequest req, NumberFormatException e) {
        logger.error("接收了一个数字格式的异常:{}", e.getMessage());
        return ResponseEntity.badRequest().body("好兄弟,数字转换异常!请检查传参的数据类型哈!");
    }

    /**
     * 请求方法不支持异常
     *
     * @param req 请求:可以记录一些传参的内容。你可以自定义日志与向响应的信息,只是当前没用到。
     * @param e   异常对象。
     * @return 响应实体
     */
    @ExceptionHandler(value = HttpRequestMethodNotSupportedException.class)
    @ResponseBody
    public ResponseEntity httpRequestMethodNotSupportedException(HttpServletRequest req, NumberFormatException e) {
        //e.printStackTrace();
        logger.error("请求方式错误的异常:{}", e.getMessage());
        return ResponseEntity.badRequest().body("好兄弟,请求方式不对哈!请检查请求方式!");
    }

    /**
     * 类型转换异常处理
     *
     * @param req 请求:可以记录一些传参的内容。你可以自定义日志与向响应的信息,只是当前没用到。
     * @param e   异常对象。
     * @return 响应实体
     */
    @ExceptionHandler(value = ClassCastException.class)
    @ResponseBody
    public ResponseEntity classCastException(HttpServletRequest req, NumberFormatException e) {
        logger.error("类型转换 异常:{}", e.getMessage());
        return ResponseEntity.badRequest().body("好兄弟,类型转换异常!请检查传参的数据类型哈!");
    }

    /**
     * 死锁异常 不能确认锁异常:可能产生原因:A是大事务,然后指定了B业务,B业务也有个事务,A等B提交事务,B一直无法提交事务,这个事务 上述有执行一遍 就会造成死锁异常
     *
     * @param req 请求:可以记录一些传参的内容。你可以自定义日志与向响应的信息,只是当前没用到。
     * @param e   异常对象。
     * @return 响应实体
     */
    @ExceptionHandler(value = CannotAcquireLockException.class)
    @ResponseBody
    public ResponseEntity cannotAcquireLockException(HttpServletRequest req, NumberFormatException e) {
        logger.error("死锁异常:{},为了避免锁表,请使用'select * from information_schema.INNODB_TRX' 如果锁表了,快速kill 某个trx_mysql_thread_id,以解除锁表", e.getMessage());
        return ResponseEntity.badRequest().body("好兄弟,锁表异常!请检查管理员处理!");
    }

    /**
     * 全部异常处理,一旦上述异常没有捕获到,就会触发本方法去拦截异常!
     *
     * @param req 请求:可以记录一些传参的内容。你可以自定义日志与向响应的信息,只是当前没用到。
     * @param e   异常对象。
     * @return 响应实体
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseEntity allException(HttpServletRequest req, Exception e) {
        logger.error("接收了一个未处理的异常:{}", e.getMessage());
        return ResponseEntity.badRequest().body("后台没有定义本次异常的处理,请联系后台,并向后台提供异常操作时间,以便于检查日志!");
    }
}

然后抓一个异常,就可以被拦截了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。

最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。 若排除这种情况,可在对应资源底部留言,或联络我们。

对于会员专享、整站源码、程序插件、网站模板、网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。

如果您已经成功付款但是网站没有弹出成功提示,请联系站长提供付款信息为您处理

源码素材属于虚拟商品,具有可复制性,可传播性,一旦授予,不接受任何形式的退款、换货要求。请您在购买获取之前确认好 是您所需要的资源