Java - слушайте, когда исключение перехватывается во внешнем классе

Есть ли способ создать слушатель в отдельном классе, который запускает определенный фрагмент кода всякий раз, когда в вашем проекте обнаруживается исключение?

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

private static final Logger logger = LogManager.getLogger(Example.class);

public void testMethod() {
    try {
        // some code here that could throw an exception
    } catch(Exception e) {
        logger.error("Unexpected error has occurred: ", e);
    }
}

Это запишет исключение, используя log4j. Однако мне нужно было бы делать это более 50 раз, и это настолько избыточно, что я бы предпочел использовать 1 метод для этого. Итак, есть ли способ сделать что-то подобное?

public class ListenerClass {

    private static final Logger logger = LogManager.getLogger(ListenerClass.class);

    // This method will be listening for exceptions to be caught within the project
    /**
     * @param e - The exception that was just caught
    */
    public void listenerMethod(ExceptionCaught e) {
        logger.error("An exception has been thrown: ", e);
    }

}

Это возможно?

Спасибо

2 ответа

Стандартный способ Java:

Thread.setDefaultUncaughtExceptionHandler( (thread, throwable) -> {
        log(throwable.getMessage(), thread.getId());
});

который справится с невоспитанным RuntimeExceptions, и если не указано иное, он будет действовать для всех потоков вашего приложения.

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


Если вы используете более старую версию java (до 8), вы должны явно создать экземпляр анонимного класса:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
      @Override
      public void uncaughtException(final Thread t, final Throwable e) {

      }
}); 

Посмотрите на Thread.setDefaultUncaughtExceptionHandler()

Другие вопросы по тегам