Этот вопрос задавался очень давно, но я хотел бы получить отзыв о шаблоне, который может быть полезен здесь. Дополнительный интерфейс или класс ExceptionHandler
может быть составлен внутри класса, который реализует Iterator и может быть реализован клиентом для устранения исключений по желанию.
public interface ExceptionHandler {
// Log, or rethrow, or ignore...
public Object handleException(Exception e);
}
Реализация классов может сделать что-то вроде этого:
public class ExceptionRethrower implements ExceptionHandler {
@Override
public Object handleException(Exception e) {
throw new RuntimeException(e);
}
}
public class ExceptionPrinter implements ExceptionHandler {
@Override
public Object handleException(Exception e) {
System.err.println(e);
return e;
}
}
Для итератора, который читает из файла, код может выглядеть примерно так:
public class MyReaderIterator implements Iterator<String> {
private final BufferedReader reader;
private final ExceptionHandler exceptionHandler;
public MyReaderIterator(BufferedReader r, ExceptionHandler h) {
reader = r;
exceptionHandler = h;
}
@Override
public String next() {
try {
return reader.readLine();
} catch (IOException ioe) {
Object o = exceptionHandler.handleException(ioe);
// could do whatever else with o
return null;
}
}
// also need to implement hasNext and remove, of course
}
Что думают люди? Это стоит такого уровня косвенности, или это расслоение нарушение и просто слишком сложно? Имя интерфейса может быть не совсем соответствующим (возможно, ExceptionProcessor или ExceptionInterceptor, так как он может взаимодействовать с исключением, но не полностью обрабатывать исключение, все же должна быть некоторая обработка в классе, в который он состоит).
Я согласен, что все это выглядит как обходной путь к тому факту, что Iterator.next () не был объявлен для создания исключений, и заставляет меня любить генераторы и модель исключений в python.