Я создал абстрактный поток, который обрабатывает некоторые потоки в своем методе run (). Мне бы хотелось, чтобы подклассы обрабатывали эти исключения, а не абстрактный родительский класс, но я не знаю, какой самый элегантный способ сделать это. Прямо сейчас я делаю что-то вроде этого:
import org.apache.logging.log4j; // (I use log4j for logging)
public interface Loggable {
Logger getLogger();
}
public abstract class ParentThread extends Thread implements Loggable {
private final static Logger logger =
Logger.getLogger(ParentThread.class); // Logger with no Appenders
@Override
public void run() {
try {
// Do some stuff that throws exceptions
doAbstractStuff();
} catch (SomeSortOfException ex) {
getLogger().error("Oh noes!", ex);
} catch (SomeOtherException ex) {
getLogger().error("The sky is falling!", ex);
}
}
public Logger getLogger() { return logger; }
protected abstract void doAbstractStuff();
}
public class ChildThread extends ParentThread {
@Override
public Logger getLogger() { /* return a logger that I actually use */ }
@Override
public void doAbstractStuff() { /* Implementation */ }
}
Полагаю, я должен упомянуть, что ChildThread на самом деле является внутренним классом моей основной формы, и что его регистратор принадлежит этой форме.
Другой подход, о котором я подумал, - это
abstract void handleException(Exception ex);
в ParentThread, но я не могу обработать отдельные исключения из ChildThread.