В системе Java MicroServices, где найти проверку ошибок?

У меня есть контроллер, который получает запрос, передает данные в службу, и служба выполняет внешний HTTP-вызов, ответ возвращается службе, а затем контроллер возвращает веб-страницу.

Сообщение об ошибке или исключение может поступить от внешнего вызова.

Должна ли проверка ошибок выполняться в службе, выполняющей внешний вызов, или в контроллере перед возвратом веб-страницы?

2 ответа

Решение

Поймайте исключение навсегда только в тех местах, где вы знаете конкретный, вероятный способ продолжения, и на верхнем уровне приложения (которого нет, если вы реализуете службу, которая будет использоваться другим приложением).

Когда вы получаете ответ об ошибке от внешнего вызова, убедитесь, что вы рассматриваете его как исключение, например, создавая и выбрасывая исключение.

В противном случае просто убедитесь, что ваш абонент получает соответствующую информацию о сбое:

  • В пределах одной JVM просто возникнет исключение.
  • Старайтесь избегать как можно большего количества исключений, чтобы у вызывающего абонента была возможность легко увидеть, что на самом деле произошло, без развертывания нескольких слоев упаковщиков исключений, а также избавить себя от большого количества непродуктивного кода.
  • На границах JVM преобразуйте исключение в соответствующее сообщение об ошибке (например, 4xx или 5xx статус HTTP).
  • Прежде чем отправить ответ об ошибке своему клиенту, зарегистрируйте ошибку. Журнал вашего клиента (если он вообще существует) не будет содержать всю информацию о проблеме и, скорее всего, не будет вам доступен.

Мне жаль говорить, что это полностью зависит от вас. Вы можете перехватить ошибку в методе вызова HTTP или перехватить все на уровне вашего контроллера, если вы предпочитаете более глобальный перехват.

Если вы используете Spring, я бы взглянул на класс ControllerAdvice и реализовал там свои ловушки для различных типов ошибок: https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

@ControllerAdvice
class GlobalControllerExceptionHandler {
    @ResponseStatus(HttpStatus.CONFLICT)  // 409
    @ExceptionHandler(DataIntegrityViolationException.class)
    public void handleConflict() {
        // Nothing to do
    }
}
Другие вопросы по тегам