如何优雅地处理异常

背景

在平时的工作开发中,异常处理是一个非常重要的工作,通过优雅的方式处理异常,我们不仅可以很好节省编写代码的工作量,还能使代码更加优雅

一般的处理方式

在平时基于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...代码块去掉呢?

@ExceptionHandler

在spring中提供了一个统一异常处理的注解,ExceptionHandler,配合RestControllerAdvice,我们便可以创建一个统一处理异常的类

  • ExceptionHandler
@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("服务异常");    }}
  • Controller
@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 条评论) “”
   
验证码:

相关文章

推荐文章