Разработка глобального обработчика исключений

Java Netty
Разработка глобального обработчика исключений

предисловие

Я недавно был немного проста, поэтому я поставил этот проект с открытым исходным кодом, который не был обновлен на полгодаcicadaСнова набрался.

Некоторые новые друзья не должны знать, для чего этот проект? Давайте сначала взглянем на официальное введение (на самом деле, я написал его сам 😀)

cicada: быстрый и легкий веб-фреймворк, основанный на Netty4; без слишком большого количества зависимостей, основной пакет jar — это всего лишь30KB.

Для этого колеса я уже писал предисловие. Если вам интересно, вы можете вернуться и посмотреть:

Прочитав их, я считаю, что должно быть больше идей для этого гаджета.

Эффект

После окончания рекламы вернуться к теме; чаще всего используетсяMVCрамкаSpringMVCОднако при построении каркаса я считаю, что глобальная обработка исключений необходима.

Весеннее использование

Обычно мы поступаем следующим образом:

ТрадицияSpringВерсия:

  • реализоватьSpringВстроенный интерфейс, переписанные методы и окончательная обработка исключений здесь.
  • настроить этот класс вSpringизxml, как bean-компонент, зарегистрированный наSpringв контейнере.
public class CustomExceptionResolver implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex) {
	//自定义处理
}
<bean class="ssm.exception.CustomExceptionResolver"></bean> 

Конечно, сейчас популяренSpringBootСуществует также соответствующая упрощенная версия:

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value = Exception.class)
    public Object defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        //自定义处理
    }
}

Все изменено на форму аннотации, но суть осталась та же.

Все для создания специального bean-компонента в контейнере.Этот bean-компонент специально используется для обработки исключений.Когда во время работы системы возникает исключение, просто найдите bean-компонент из контейнера и выполните методы.

Что касается этого конкретногоbeanКак его идентифицировать — это не что иное, как реализация определенного интерфейса или его объявление с помощью аннотаций, что соответствует традиционномуSpringиSpringBootиспользование.

использование цикады

cicadaПри разработке моего собственного глобального обработчика исключений я также ссылаюсь на родственный дизайн Spring, поэтому окончательное использование выглядит следующим образом:

@CicadaBean
public class ExceptionHandle implements GlobalHandelException {
    private final static Logger LOGGER = LoggerBuilder.getLogger(ExceptionHandle.class);

    @Override
    public void resolveException(CicadaContext context, Exception e) {
        LOGGER.error("Exception", e);
        WorkRes workRes = new WorkRes();
        workRes.setCode("500");
        workRes.setMessage(e.getClass().getName() + "系统运行出现异常");
        context.json(workRes);
    }
}

Пользовательская реализацияGlobalHandelExceptionКласс интерфейса, при возникновении исключения в запросе, страница и фон будут выводиться следующим образом:

дизайн

см. использование иSpringОчень похоже, но тоже нужно реализовать интерфейсGlobalHandelException, использовать одновременно@CicadaBeanАннотируйте класс, чтобы загрузить его вcicadaВстроенныйIOCвнутри контейнера.

Когда возникает исключение, в этомIOCнайти объект в контейнере и вызвать егоresolveExceptionВот и все.

что также может бытьCicadaContextГлобальный контекст реагирует на разные выходные данные (json/text/html).

основной принцип

Нарисована простая блок-схема, и шаги следующие:

  • Реализация будет найдена во время инициализацииGlobalHandelExceptionкласс интерфейса, создайте его экземпляр и зарегистрируйте его с помощьюIOCв контейнере.
  • При возникновении исключения из контейнера получается объект обработчика исключений, и функция обработки в нем может выполняться.

После долгого разговора о принципе, давайте посмотрим, как реализован исходный код.

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

один из нихGlobalHandelExceptionСамо определение тоже очень простое:


Далее время выполнения:

И когда возникает исключение, он передает ранее сохраненную обработку исключенияbeanОбработка исключений выполняется, и глобальный контекст и информация об исключении передаются одновременно с вызовом.

Таким образом, мы можем реализовать нашу собственную логику обработки исключений в этом классе реализации.

Суммировать

На случай, если интервьюер спросит вас в будущемSpringMVCКак реализована обработка исключений? Вы должны знать, как на него ответить 😏.

В то же время он может быть и расходящимся, можно ли настроить цель для определенногоcontrollerобработка исключений, чтобы каждыйcontrollerСгенерированное исключение можно обработать отдельно, если нет настройки, то оно попадет в глобальное исключение, принцип аналогичен, и заинтересованные друзья могут упомянуть об этом.PRзавершитьfeature.

Исходный код проекта:

GitHub.com/вместе ОС/…

Ваши лайки и репост - лучшая поддержка для меня