博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpingBoot系列教程(三):SpringBoot配置全局异常/自定义异常
阅读量:3900 次
发布时间:2019-05-23

本文共 3040 字,大约阅读时间需要 10 分钟。

  • 与上篇相辅相成的就是异常了,这边博客主要讲述如何配置全局异常/自定义异常。

相关注解

  1. ControllerAdvice:用来实现全局异常,需要定义类,添加该注解即可。处理的是Controller层异常。

    示例代码:

    @ControllerAdvicepublic class ErrorController {
    }

    因为异常处理时候很多使用JSON来进行处理,所以很多时候ControllerAdvice替换为RestControllerAdvice

  2. ExceptionHandler:指定异常的处理方式,声明于方法的上部。

    实例代码:

    //value可设定处理指定异常的类型, Exception为处理所有@ExceptionHandler(value = Exception.class)    Object handleException(Exception e, HttpServletRequest request){
    return object; }

代码演示

  • Controller部分

    @RestController@RequestMapping("user")public class UserController {
    @RequestMapping("error") public void error(){
    int i = 1/0; } @RequestMapping("nullException") public void nullException(){
    String str = null; str.indexOf(","); }}
  • 异常处理类

    @RestControllerAdvicepublic class ErrorController {
    //发生异常,写入日志,方便后期查看。 private static final Logger LOG = LoggerFactory.getLogger(ErrorController.class); /** * 默认处理所有异常 */ @ExceptionHandler(value = Exception.class) Object handleException(Exception e, HttpServletRequest request){
    //此处是我的日志格式。不影响代码正常执行。 LOG.error("url{},msg{}",request.getRequestURI(),e.getMessage()); //定义map,返回异常信息方便操作 Map
    map = new HashMap<>(); //code参数,我理解为状态码,这里自由定义。 //如果不想使用map,使用实体类等都是可行的。 map.put("code",100); //msg,可自由定义。比如map.put("msg","请求参数错误!"); map.put("msg",e.getMessage()); return map; }}
  • 示例

​ 可以看到页面输出了俩种异常,存储在map的信息,不过并不直观,且无法准确描述具体的异常。

异常拆分

  • 一个方法处理所有的异常,是不妥的。建议拆分多个方法,每个方法对应特定异常,回显特定信息,方便后期的问题定位。当然,下方这种代码,理论上可以区分,但方法太长,不够精简。(想象一个方法一个类的情况)

    @ExceptionHandler(value = Exception.class)        Object handleException(Exception e, HttpServletRequest request){
    Map
    map = new HashMap<>(); if (e instanceof ArithmeticException) {
    map.put("code",100); map.put("msg","请求参数错误"); } else if (e instanceof NullPointerException) {
    map.put("code",101); map.put("msg","空指针异常!"); } return map; }
  • 个人建议下方这种

    //默认为所有异常,但优先级低于下方方法,因此有NullPointerException异常,执行下方方法,返回信息 @ExceptionHandler(value = Exception.class)    Object handleException(Exception e, HttpServletRequest request){
    //此处是我的日志格式。不影响代码正常执行 LOG.error("url{},msg{}",request.getRequestURI(),e.getMessage()); //定义map,返回异常信息方便操作 Map
    map = new HashMap<>(); map.put("code",100); map.put("msg","后台发生错误"); return map; } //处理空指针异常 @ExceptionHandler(value = NullPointerException.class) Object handleNullPointerException(Exception e, HttpServletRequest request){
    LOG.error("url{},msg{}",request.getRequestURI(),e.getMessage()); Map
    map = new HashMap<>(); map.put("code",100); //map.put("msg",e.getMessage()); map.put("msg","空指针异常"); return map; }

后期完善

  1. 关于异常再完善下,自定义错误页面相关知识。
  2. 异常依赖于SpringAOP相关部分,出一篇AOP的博客。

转载地址:http://xxden.baihongyu.com/

你可能感兴趣的文章
TCP与UDP收发的时候TCP有缓冲区还是UDP有缓冲区,使用它们时该注意什么?
查看>>
C++中map、hash_map、unordered_map、unordered_set通俗辨析
查看>>
clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结
查看>>
运算符重载参数的顺序对运算是否有影响
查看>>
什么时候要用虚析构函数?
查看>>
序列化、反序列化与jsoncpp学习
查看>>
同步/异步与阻塞非阻塞的关系
查看>>
epoll模型讲解/源码分析
查看>>
java继承 long和float小记点
查看>>
记录几点在开发中遇到的问题 2015-7-28 (会更新)
查看>>
网银在线的异步操作代码示意图
查看>>
火狐Firefox浏览器安装Selenium_IDE的步骤以及其使用规则
查看>>
记录运行代码的时间长短
查看>>
关于yii2的一些知识的学习笔述
查看>>
用纯php实现MVC框架,文件目录模仿yii2
查看>>
新开发的体重管理项目----用纯php模仿yii2框架建立的
查看>>
JavaScript面向对象编程指南 的笔记
查看>>
在 2016 年做 PHP 开发是一种什么样的体验?(一)
查看>>
PHP获取客户端的IP
查看>>
从头开始学习yii2---1.搭建yii2开发环境
查看>>