Присоедините UncaughtExceptionHandler к TimerTask - PullRequest
1 голос
/ 01 апреля 2009

Можно ли прикрепить UncaughtExceptionHandler к TimerTask?

(кроме как по телефону Thread.setDefaultUncaughtExceptionHandler())

Ответы [ 2 ]

2 голосов
/ 01 апреля 2009

Вы можете написать TimerTask прокси, который перехватывает Throwable из run.

public final class TimerTaskCatcher extends TimerTask {
    private final TimerTask orig;
    private final Thread.UncaughtExceptionHandler handler;
    public TimerTaskCatcher(
        TimerTask orig, 
        Thread.UncaughtExceptionHandler handler
    } {
        if (orig == null || handler == null) {
            throw new NullPointerException();
        }
        this.orig = orig;
        this.handler = handler;
    }
    @Override public boolean cancel() {
        return orig.cancel();
    }
    @Override public void run() {
        try {
            orig.run();
        } catch (Throwable exc) {
            handler.uncaughtException(Thread.currentThread(), exc);
        }
    }
    @Override public long scheduledExecutionTime() {
        return orig.scheduledExecutionTime();
    }
}

Кстати: вы можете рассмотреть возможность использования java.util.concurrent вместо Timer.

0 голосов
/ 01 апреля 2009

Да, я так думаю. В Thread class есть метод экземпляра ( setUncaughtExceptionHandler ), который устанавливает UncaughtExceptionHandler потока.

В вашем run методе TimerTask вы можете сделать что-то вроде этого:

public void run() {
    Thread.currentThread().setUncaughtExceptionHandler(eh);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...