系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的 dao、service、controller 出现异常都通过 throws Exception 向上抛出,最后由 springmvc 前端控制器交由异常处理器进行异常处理
实现步骤:
1.编写异常类
/** * 自定义异常类型 */ public class CustomException extends RuntimeException { private ResultCode resultCode; // 自定义的错误代码 public CustomException(ResultCode resultCode) { this.resultCode = resultCode; } public ResultCode getResultCode() { return resultCode; } }
2.定义异常抛出类,方便调用,不用每次都手动new一个异常
/** * 异常抛出类 */ public class ExceptionCast { public static void cast(ResultCode resultCode) { throw new CustomException(resultCode); } }
3.自定义统一异常捕获类,可以扩展捕获更多异常
/** * 统一异常捕获类 */ @ControllerAdvice // 控制器增强 public class ExceptionCatch { private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class); // 捕获CustomException此类异常 @ExceptionHandler(CustomException.class) @ResponseBody // 响应json数据给客户端 public ResponseResult customException(CustomException ce) { // 记录日志 LOGGER.error("catch exception: {}", ce.getMessage()); ResultCode resultCode = ce.getResultCode(); // ResponseResult 自定义的返回错误信息类 return new ResponseResult(resultCode); } // 捕获Exception此类异常 @ExceptionHandler(Exception.class) @ResponseBody public ResponseResult exception(Exception e) { // 记录日志 LOGGER.error("catch exception: {}", e.getMessage()); // CommonCode:自定义的通用错误代码和自定义错误代码ResultCode具有相同的作用 return new ResponseResult(CommonCode.SERVER_ERROR); } }
4.抛出自定义异常