Как бизнесмен, вы обязательно столкнетесь с обработкой исключений в коде бизнес-интерфейса, таких как исключения с логикой кода, исключения в бизнес-логике и так далее. Этих аномальных сценариев очень и очень много. С таким количеством логики исключений, с которыми нужно иметь дело, это означает писать много повторяющегося кода. Как бизнесмен, который немного преследует, он не может просто понять CURD. Конечно, он надеется чтобы код выглядел лаконично и удобно.
В этой статье мы хотим рассказать об эволюции автора в обработке исключений, а затем привести пример унифицированной обработки исключений.
Первоначальный метод заключается в определении класса бизнес-исключения.Когда бизнес-исключение перехвачено, используйте код ошибки исключения и информацию об ошибке для создания подсказки об ошибке и возврата.
/**
* 错误码枚举类
*/
public enum ResponseCode {
SUCCESS(0, "OK"),
SERVER_ERROR(1, "server error");
private int code;
private String msg;
ResponseCode(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public ResponseCode setCode(int code) {
this.code = code;
return this;
}
public String getMsg() {
return msg;
}
public ResponseCode setMsg(String msg) {
this.msg = msg;
return this;
}
}
/**
* 自定义业务异常类
*/
public class BizException extends RuntimeException {
private final int code;
public BizException(ResponseCode errCode) {
super(errCode.getMsg());
this.code = errCode.getCode();
}
public BizException(ResponseCode errCode, String msg) {
super(msg);
this.code = errCode.getCode();
}
public BizException(int code, String msg) {
super(msg);
this.code = code;
}
public int getCode() {
return this.code;
}
}
class TestService {
public void testAMethod() {
// 业务异常代码
throw new BizException(ResponseCode.BIZ_CODE);
}
}
/**
* 接口返回的通用结构HttpResult
* {"code": 0, "msg": "OK"}
*/
class TestController {
@Autowired
private TestService testService;
public HttpResult testA() {
try {
testService.testAMethod();
} catch (BizException e) {
return HttpResult(e.getCode(), e.getMsg());
} catch (Exception e) {
return HttpResult(ResponseCode.SERVER_ERROR);
}
return HttpResult(ResponseCode.SUCCESS);
}
}
Позже выяснилось, что необходима оптимизация.Во-первых, с увеличением количества бизнес-кодов эти try...catch выглядели раздутыми.
Во-вторых, когда в нижележащем коде есть исключение, оно должно быть перехвачено во внешнем слое, а затем выброшено слой за слоем, пока при возврате бизнес-интерфейс не вернет сообщение об ошибке, если это интерфейс с особенно сложной бизнес-логикой. , код обработки исключений будет распространяться по всей системе, из-за чего эти коды исключений выглядят неприглядно, а код становится менее читаемым.
Со временем я задумался, существует лиПерехватчик проверкиТочно так же эти суждения обрабатываются единообразно в одном месте, чтобы код выглядел красивее.ответ да, это использоватьExceptionHandler
а такжеRestControllerAdvice
аннотация.
Сначала определите класс:SpringMvcExceptionDemo
, класс плюсRestControllerAdvice
Аннотация, в классе определен метод exceptionHandler, и метод имеет префиксExceptionHandler
Annotation, а затем вы можете написать логику оценки исключения в методе и соответствующим образом обработать логику исключения.
Конкретный пример кода реализации выглядит следующим образом:
@RestControllerAdvice
public class SpringMvcExceptionDemo {
@ExceptionHandler
public Object exceptionHandler(Exception e, HttpServletRequest request, HttpServletResponse response) {
if (e instanceof BizException) {
BizException be = (BizException) e;
return new HttpResult(be.getCode(), be.getMessage());
}
if (e instanceof IllegalArgumentException) {
return new HttpResult(ResponseCode.PARAM_ERROR.getCode(), e.getMessage());
}
return new HttpResult(ResponseCode.SERVER_ERR);
}
}
public HttpResult testA() {
testService.testAMethod();
return HttpResult(ResponseCode.SUCCESS);
}
Таким образом, необходимо генерировать исключения только в том месте, где генерируются бизнес-исключения, а перехватчики могут обрабатывать исключения единообразно, что сокращает количество повторяющегося кода и улучшает читаемость кода.
RestControllerAdvice и обработчик исключений
RestControllerAdvice — это аннотация в среде Spring, эта аннотация содержит
ControllerAdvice
а такжеResponseBody
, что помогает нам, добавляя точку пересеченияExceptionHandler
для обработки исключений в RestfulAPI. Время выполнения равноdoDispatch
, вызовprocessDispatchResult
метод, если есть исключение, он будет вызван добавленнымExceptionHandler
Метод аннотации судить.
Блок-схема выглядит следующим образом:
Код основной обработки:
for (HandlerExceptionResolver handlerExceptionResolver : this.handlerExceptionResolvers) {
exMv = handlerExceptionResolver.resolveException(request, response, handler, ex);
if (exMv != null) {
break;
}
}
Суммировать
Код и принцип относительно просты. Целью единообразной обработки исключений является устранение повторяющихся блоков кода и написание более лаконичного кода. Теперь написание кода также настаивает на этой идее. Я надеюсь изучить больше навыков, и другие навыки приветствуются. Обсудить .
Оригинал статьи, ограниченный стиль написания, недостаток знаний и знаний, если есть неточности в статье, сообщите пожалуйста.
Если статья была вам полезна, ставьте лайк, спасибо
Для более интересного контента, пожалуйста, обратите внимание на личный публичный номер.