Слово о проверенных исключениях


  1. Лучший способ использования исключений, это унификация отчетов об ошибках: стандартный механизма, с помощью которого сообщается об ошибках, вместо винегрета игнорируемых приближений, которые мы имеем в C (а также C++, в который просто добавлены исключения, а не используется исключительно этот подход). Наибольшее преимущество Java над C++ в том, что исключения — это просто способ сообщения об ошибке.

  2. "Игнорирование" в предыдущем параграфе - это другая возможность. Теория говорит о том, что компилятор заставляет программиста либо обрабатывать исключения, либо передавать их путем указания спецификации, внимание программистов всегда будет обращено на возможность ошибки и они должным образом позаботятся об этом. Я думаю, что проблема в нашем непроверенном предположении, что разработчиков языков уходят в область психологии. Моя теория заключается в том, что когда кто-либо собирается что-то сделать, и вы постоянно досаждаете ему неприятностями, он будет использовать наиболее быстрое существующее устройство, чтобы заставить исчезнуть это раздражение, чтобы он мог завершить начатое, возможно он позже вернется и уберет это устройство. Я заметил, что сделал нечто подобное в первой редакции Thinking in Java:

...

} catch (SomeKindOfException e) {}

Затем я забыл об этом до тех пор, пока не стал переписывать. Сколько людей подумали, что это хороший пример и последовали ему? Martin Fowler начал просматривать подобный код и понял, что люди хотели перехватить исключения и они должны исчезнуть. Накладные расходы проверки исключений имеют обратный эффект своего предназначения, который может всплыть при экспериментах (и сейчас я верю, что проверенные исключения были экспериментом, основанным на том, что кто-то думал, что это хорошая идея, и я верил, что это хорошая идея, до недавнего времени).

Когда я начал использовать Python, все исключения появлялись, но ни одно случайно не "исчезало". Если вы *хотите* поймать исключение, вы можете, но вы не обязаны писать кучу кода каждый раз при обработке исключений. Оно идет туда, где вы хотите поймать его, или они все выходят наружу, если вы забыли (и таким образом они напомнят о себе), но они не исчезнут, во всех возможных случаях. Теперь я верю, что проверенные исключения поощряют людей делать их исчезнувшими. Плюс к этому, они делают код менее читабельным.

В заключение, я думаю, что мы должны реализовывать экспериментальную природу исключений и рассматривать их с осторожностью, прежде чем предположить, что все, что касается исключений в Java - это хорошо. Я верю, что владение единым механизмом для обработки ошибок - это превосходно, и я верю, что использование разделяемых каналов (механизма обработки исключений) для передачи исключений далее - это хорошо. Но я помню один из ранних аргументов обработки исключений в C++, который заключался в том, что программисту необходимо позволить разделять секцию кода, в которой он просто хочет завершить работу, от секции, в которой он обрабатывает ошибку, а для меня это не выглядит, как будто проверка исключений делает это разделение. Вместо этого исключения способствуют внедрению (огромного количества) кода в ваш "нормально работающий код", а это шаг назад. Мой опыт работы с поддержкой исключений в Python подтверждает это, и если я не изменю мнения относительно этой проблемы, я намереваюсь помещать гораздо больше RuntimeException в мой код на Java.