Java 项目中处理异常方式无非两种,要么执行 trycatch 操作,要么执行 throw 操作(抛
给其它对象处理),无论采用哪种方式,其目的是让我们的系统对异常要有反馈。但现在的
问题是我们如何让这种反馈代码的编写即简单又直观、友好呢?我们在处理异常的过程中通
常要遵循一定的设计规范,例如:
捕获异常时与抛出的异常必须完全匹配,或者捕获异常是抛出异常的父类类型。
▪ 避免直接抛出 RuntimeException,更不允许抛出 Exception 或者 Throwable,应
使用有业务含义的自定义异常(例如 ServiceException)。
▪ 捕获异常后必须进行处理(例如记录日志)。如果不想处理它,需要将异常抛给它
的调用者。
▪ 最外层的逻辑必须处理异常,将其转化成用户可以理解的内容。
▪ 避免出现重复的代码(Don’t Repeat Yourself),即 DAY 原则。

Web 全局异常处理

当项目由多个控制层类中有多个共性异常的处理方法定义时,我们可以将这些方法提取
到公共的父类对象中,但是这种方式是一种强耦合的实现,不利于代码的维护。我们还可以
借助 spring 框架中 web 模块定义的全局异常处理规范进行实现,例如定义全局异常处理类,
代码如下:

package com.cy.pj.sys.web.advice;
import com.cy.pj.sys.web.pojo.JsonResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
 * 此注解描述的类为全局异常处理类
 */
@RestControllerAdvice //@ControllerAdvice+@ResponseBody
public class GlobalExceptionHandler {
    private static final Logger log=
    LoggerFactory.getLogger(GlobalExceptionHandler.class);
    /**@ExceptionHandler 注解描述的方法为异常处理方法,
 * 注解中定义的异常类型为方法可以处理的异常类型.*/
 @ExceptionHandler(RuntimeException.class)
    public JsonResult doHandleRuntimeException(RuntimeException e){
        e.printStackTrace();
        log.debug("exception msg is", e.getMessage());
        return new JsonResult(e);
    }
}

1.上面的代码中 private static final Logger log=LoggerFactory.getLogger(GlobalExceptionHandler.class);可以通过使用@Slf4j(使用该注解需要添加Lombok插件和Lombok依赖)实现日志的输出
2.上面的代码只实现了RuntimeException的全局处理,其他类型的全局异常处理使用相同方式设计


fubin
10 声望0 粉丝