在平时的工作开发中,异常处理是一个非常重要的工作,通过优雅的方式处理异常,我们不仅可以很好节省编写代码的工作量,还能使代码更加优雅
在平时基于spring开发时,我们基本都会使用前后端分离的形式,来开发代码,我们来看一下基本处理异常的方式
Response
public class Response { public static final Integer SUCCESS = 200; public static final Integer FAIL = -1; public static final Integer NOT_LOGIN = 0; public static final String SUCCESS_MESSAGE = "访问成功"; public static final String FAIL_MESSAGE = "系统异常"; private Integer code; private String message; private T data; private Response(Integer code, String message, T data) { this.code = code; this.message = message; this.data = data; } private Response(Integer code, String message) { this.code = code; this.message = message; } public static final ResponseBuilder builder() { return new ResponseBuilder(); } public Integer getCode() { return code; } public String getMessage() { return message; } public T getData() { return data; } public static class ResponseBuilder { private Integer code = SUCCESS; private String message = SUCCESS_MESSAGE; private T data; private ResponseBuilder() { } public ResponseBuilder code(Integer code) { this.code = code; return this; } public ResponseBuilder message(String message) { this.message = message; return this; } public ResponseBuilder data(T data) { this.data = data; return this; } public Response build() { return new Response(this.code, this.message, this.data); } public Response success() { return success(SUCCESS_MESSAGE); } public Response success(String message) { return new Response(SUCCESS, message); } public Response fail() { return fail(FAIL_MESSAGE); } public Response fail(String message) { return new Response(FAIL, message); } }} package com.haidechizi.mybatis.demo.web;import com.haidechizi.mybatis.demo.Response;import com.haidechizi.mybatis.demo.entity.User;import com.haidechizi.mybatis.demo.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RequestMapping("user")@RestControllerpublic class UserController { @Autowired private UserService userService; @RequestMapping("insertUser") public Response insertUser(@RequestBody User user) { try { user = userService.insertUser(user); return Response.builder().data(user).build(); } catch (Exception e) { return Response.builder().data(user).build(); } } @RequestMapping("updateUser") public Response updateUser(@RequestBody User user) { try { user = userService.updateUser(user); return Response.builder().data(user).build(); } catch (Exception e) { return Response.builder().data(user).build(); } } @RequestMapping("deleteUser") public Response deleteUser(@RequestBody User user) { try { userService.deleteUser(user); return Response.builder().data(user).build(); } catch (Exception e) { return Response.builder().data(user).build(); } }}每个controller,我们都需要使用try ...catch...来处理异常,这样不仅书写麻烦,每个方法都需要写很多与业务无关的代码,而且代码看以来也没有那么优雅,那么我们应该如何将每个方法的try...catch...代码块去掉呢?
在spring中提供了一个统一异常处理的注解,ExceptionHandler,配合RestControllerAdvice,我们便可以创建一个统一处理异常的类
@Slf4j@RestControllerAdvicepublic class GlobalExceptionHandler { @ExceptionHandler(NoLoginException.class) public Response<?> noLogin(NoLoginException noLoginException) { return Response.builder().code(noLoginException.getCode()).message(noLoginException.getMessage()).build(); } @ExceptionHandler(AppException.class) public Response<?> customException(AppException appException) { return Response.builder().fail(appException.getMessage()); } @ExceptionHandler(Exception.class) public Response<?> exception(Exception exception) { log.error("服务异常", exception); return Response.builder().fail("服务异常"); } @ExceptionHandler(Throwable.class) public Response<?> throwable(Throwable throwable) { log.error("服务异常", throwable); return Response.builder().fail("服务异常"); }}@RequestMapping("user")@RestControllerpublic class UserController1 { @Autowired private UserService userService; @RequestMapping("insertUser") public Response insertUser(@RequestBody User user) { user = userService.insertUser(user); return Response.builder().data(user).build(); } @RequestMapping("updateUser") public Response updateUser(@RequestBody User user) { user = userService.updateUser(user); return Response.builder().data(user).build(); } @RequestMapping("deleteUser") public Response deleteUser(@RequestBody User user) { userService.deleteUser(user); return Response.builder().data(user).build(); }}使用统一异常处理后,我们的代码变得十分简洁,再也没有那一坨try...catch...代码块了
| 留言与评论(共有 0 条评论) “” |