2018-5-27 日志记录(Spring MVC异常处理)

时间:2021-07-09 00:29:29

今日工作:对自己项目的异常做了下处理,改变以往的try...catch()的模式,直接抛出异常,

交给Spring MVC框架处理,不在单独手动处理。

@ControllerAdvice+    @ExceptionHandler 全局异常处理

、前言

对于常用的Spring MVC一类的web项目,总是在业务层进行一些核心业务的操作,数据库的持久

化也是在这一层进行调用,当数据库的操作出现异常的时候,就会抛出,然后事物管理器回滚事务。


那么,那么异常的处理就交给了调用者Controller,传统的try...catch模式又来了,这一套很烦,有没有?

每次都把代码弄得不整洁了,而且这层代码也是很冗余的。

例如:下面Controller层代码(伪代码)

       try {
            // 1、执行数据检验
            Utils.validate(errors);
            // 2、执行业务
            xxxService.login();
            // 3、数据返回
        } catch (Exception e) {
            log.debug("error---"+e.getMessage());
            e.printStackTrace();
        }

所以避开这类代码就显得尤为重要,下面就来说说@ControllerAdvice+@ExceptionHandler处理异常的神奇之处了。

1、局限性

我们知道每种技术都有其局限性,那么这种方式的优缺点是什么呢?

1)优点:不得不说这是Spring MVC最好的解决方案,减少了Controller的代码量,整洁代码,同时也可以很方便的

管理代码,利于维护吧!

2)缺点:不能处理框架级别的异常,例如Spring抛出的异常

2、简单的一个例子

2.1 加上全局异常处理注解:@ControllerAdvice

/**
 * 全局异常处理---需要注意扫包该类被扫描
 */
@ControllerAdvice
@ResponseBody
public class GlobalException {}

这个被注解的异常处理类,需要被Spring扫包扫到,不然无法提供服务。

2.2 定义全局处理方法:@ExceptionHandler

    /**
     * 全局异常的处理方法
     * @param ex
     * @return
     */
    @ExceptionHandler(Exception.class)
    public String executeException(Exception ex) { }

被@ExceptionHandler注解的方法可以处理不同的异常,前提是在直接中写入需要捕获的异常类型,

当程序抛出了该类异常,就会被处理,这里大家可以试试自定义异常,很方方便的可以统一处理异常

信息。

这个时候,就可以对Controller层的try...catch()说拜拜了。

问题:当时是在每一个Handler中加入@ExceptionHandler的注解方法来处理异常信息,导致代码又多

了很多的重复代码。

解决:做全局统一的异常就可以解决了,只需要写一个类即可。

明日计划:明日计划完成Spring MVC登录拦截器