исключения + сигнализация конца итератора: почему это плохо в Java и нормально в Python?

Я действительно запутался: Стандартный подход в Java - бросать исключения только в "ненормальных" условиях и не использовать их для сигнализации конца итератора.

примеры: Effective Java, пункт 57 ("Используйте исключения только для исключительных условий") и JavaSpecialists newsletter 162:

Управление потоком

Мы никогда не должны вызывать исключение, которое иначе можно предотвратить. Я видел код, где вместо проверки границ предполагается, что данные будут правильными, а затем отлавливаются RuntimeExceptions:

Вот пример плохого кода (пожалуйста, не пишите так):

public class Antipattern1 {
 public static void main(String[] args) {
 try {
 int i = 0;
 while (true) {
 System.out.println(args[i++]);
 }
 } catch (ArrayIndexOutOfBoundsException e) {
 // мы закончили
 }
 }
}

тогда как стандартно использовать эту идиому в Python, например, StopIteration:

exception StopIteration

Вызывается методом next() итератора, чтобы сигнализировать, что больше нет значений. Это производное от Exception, а не от StandardError, поскольку в обычном применении это не считается ошибкой.

Почему это плохо для Java, но хорошо для Python?

12
задан Jason S 17 October 2011 в 21:10
поделиться