Реагировать на любое возникшее исключение - PullRequest
1 голос
/ 10 июля 2020

Проблема

Я хотел бы отреагировать на возникновение исключения. Поэтому, если кто-то напишет

throw new FooException();

, система должна уведомить меня, чтобы я смог отреагировать на это событие.

Я также приму ответы, предлагающие фреймворки или инструменты, которые решают эту проблему, включая манипулирование байтовым кодом.

Подробности

  • Он должен работать с любыми исключениями ; поэтому подклассы Exception, включая RuntimeException. Меня не интересуют Error s.
  • Он также должен срабатывать для уже пойманных исключений, независимо от того, где в базе кода это произошло (в том числе внутри JDK).

Итак, если кто-то делает

try {
    foo();
} catch (FooException e) {
    ...
}

, я тоже хочу иметь возможность реагировать на это, не изменяя исходный код ....

Из-за что, try-catch-em-all вокруг основного потока не работает, он не будет перехватывать уже пойманные исключения.

То же самое касается Thread.setDefaultUncaughtExceptionhandler(...), не решит проблема.

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

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Аспектно-ориентированное программирование может предоставить решение: в основном, оно позволяет вам «добавлять» фрагменты кода (называемые «советами») в определенных c местах (называемых «точками соединения»).

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

@Aspect
class ExceptionMonitoring {

    @AfterThrowing(pointcut = "call(* *.*(..))", throwing = "java.lang.Exception")
    public void logException(JoinPoint joinpoint, Exception exception) {
        System.out.println("The method " + joinpoint.getSignature().getName() + " threw " + exception);
    }
}
1 голос
/ 10 июля 2020

Не совсем уверен, что это сработает, но, возможно, создайте обработчик как метод c stati, чтобы вы могли сделать что-то вроде этого

ErrorHandler.handle(Class<ExceptionClass> clazz)

и ввести этот код в каждый конструктор класса исключения, доступный в пути к классам? Вы можете получить исключения, просканировав путь к классам с помощью библиотеки отражений, а затем попытавшись выполнить манипуляции с байт-кодом в этих классах с помощью javassist или чего-то подобного? app с помощью этого agentlib, чтобы манипуляции выполнялись до запуска самого приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...