Можно ли автоматически вызывать метод внутреннего исключения при возникновении исключения? - PullRequest
0 голосов
/ 06 августа 2020

Мне нужно выполнять метод каждый раз, когда генерируется определенное настраиваемое исключение. Выполненный код сообщит об исключении моему API. Класс исключения имеет параметр boolean, который указывает, следует ли сообщать об исключении или нет. Предположим, у меня закодировано следующее исключение:

public MyException extends Exception {
    
    private final String message;

    private final int code;

    private final boolean report;
 
    public MyException(String message, int code, boolean report) {
        this.message = message;
        this.code = code;
        this.report = report;
    }

    public void report() {
        if(report) {
            // Report some stuff
        }
    }

}

Когда выбрано MyException, я хочу, чтобы код из report() был выполнен. Я уже думал о вызове метода вручную:

try {
     throw new MyException("Test", 1, true);
} catch(MyException e) {
     e.report();
}

Но мне было интересно, можно ли вызвать функцию автоматически при выбросе исключения.

...
throw new MyExcepion("Test", 1, true); // Implicitlly calls report()
...

Обратите внимание, что я делаю не хочу вызывать его при создании экземпляра исключения, потому что могло произойти что-то вроде этого:

...
public MyException(String message, int code, boolean report) {
        this.message = message;
        this.code = code;
        this.report = report;
        report();
}
...
int var = 0;
MyException ex = new MyException("test", 1, true);
if (var != 0) {
    throw ex;
}
//  Here the exception would be reported but never thrown.

Возможно ли это вообще? Может ли это сделать сторонняя библиотека? Любая помощь приветствуется!

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Вы можете использовать и UncaughtExceptionHandler .

Шаблон использования будет следующим:

  1. Создайте свой собственный UncaughtExceptionHandler, который является лишь реализацией одного метод: uncaughtException()
  2. Зарегистрируйте свой обработчик в каждом потоке или ThreadGroup, используя setDefaultUncaughtExceptionHandler

Если вы используете любую структуру, например Java EE или Spring, могут быть лучшие (более чистые) методы, например Java EE ExceptionMapper .

1 голос
/ 06 августа 2020

Spring AspectJ может быть ответом, если у него уже есть Spring - см. Пример https://howtodoinjava.com/spring-aop/aspectj-afterthrowing-annotation-example/

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