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());
});
который справится с невоспитанным RuntimeException
s, и если не указано иное, он будет действовать для всех потоков вашего приложения.
Просто помните, что исключения создаются по какой-то причине, и их не следует игнорировать, особенно RuntimeException
s.
Если вы используете более старую версию java
(до 8), вы должны явно создать экземпляр анонимного класса:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(final Thread t, final Throwable e) {
}
});