предисловие
Я недавно был немного проста, поэтому я поставил этот проект с открытым исходным кодом, который не был обновлен на полгодаcicadaСнова набрался.
Некоторые новые друзья не должны знать, для чего этот проект? Давайте сначала взглянем на официальное введение (на самом деле, я написал его сам 😀)
cicada: быстрый и легкий веб-фреймворк, основанный на Netty4; без слишком большого количества зависимостей, основной пакет jar — это всего лишь
30KB
.
Для этого колеса я уже писал предисловие. Если вам интересно, вы можете вернуться и посмотреть:
- "Строим колесо" - цикада (облегченный WEB фреймворк)
- "Построить колесо" - анализ исходного кода цикады
- "Построить колесо" - cicada проектирует модуль конфигурации
- «Строим колесо» — глобальный контекст дизайна цикад
- Разработка перехватчика с использованием шаблона цепочки ответственности
- Разработка подключаемого контейнера IOC
Прочитав их, я считаю, что должно быть больше идей для этого гаджета.
Эффект
После окончания рекламы вернуться к теме; чаще всего используется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
.
Исходный код проекта:
Ваши лайки и репост - лучшая поддержка для меня