Ответ 3
Существует языковая модель, которая соответствует парадигме, основанной на функциях C, где все функции возвращают значение, и пользователю нужно проверить возвращаемое значение. Perl находится в этой группе. Если я вызываю функцию, то я обязан проверить, действительно ли эта функция вернула что-то полезное.
Существует еще одна языковая модель, которая следует за основанной на исключениях парадигмой Java, где функции, которые не возвращают исключения, и если пользователю необходимо обработать исключение, они должны явно обрабатывать исключение. Большинство современных языков, написанных с Java, следуют этому основанию на основе исключений.
Новые языки основаны на исключениях, потому что они обрабатывают ленивую проблему с разработчиками. В языках программирования стиля C, если разработчик забывает или не утруждает себя проверкой статуса выхода функции, программа продолжает работу. В языках программирования стиля Java программа умирает. В обоих случаях разработчик может справиться с проблемой недействительного результата функции, так что эти языки, основанные на исключениях, заставляют разработчиков делать это.
Почему вы не видите use autodie
здесь? Несколько теорий:
Он новый
Прагма autodie
довольно новая, и у большинства разработчиков нет хорошего способа включить новые знания в их программирование на Perl. Например, say
существует с 5.10, но я все еще вижу, что немногие разработчики используют его, даже несмотря на то, что оно значительно улучшается по сравнению с print
и прост в использовании. Если разработчик не узнает autodie
, когда они изначально изучают Perl, они, вероятно, никогда не узнают об этом.
Нет синтаксиса Try/Catch в Perl
Здесь, как обычно работает Perl:
open $fh, "<", $file;
if ( not defined $fh ) {
... # What I do if `$fh` didn't get set.
}
Я проверяю значение $fh
после моего оператора open
(хорошо, вы обычно проверяете возвращаемое значение open
, а не открытое $fh
, но несите меня!). Синтаксис довольно прост и чист. Это легко понять.
Что делать, если вы использовали autodie
и использовали подход на основе исключения? В Perl нет встроенного оператора try/catch
, как в Java. Вместо этого вы используете полу-неуклюжий способ использования eval
:
use autodie;
my $fh; # Got to be declared outside of the eval
eval {
open $fh, "<", $file;
}; # Don't forget that semicolon!
if ( [email protected] ) {
... # What I do if function "foo" doesn't return a good value...
}
Вы можете сказать yucky? Я знал, что ты сможешь! Поскольку $fh
лексически ограничен, я должен объявить его перед моим eval
. Кроме того, я даже не попал в проблему [email protected]
, являющуюся переменной с глобальным охватом!
Непосредственный путь
Большинство модулей и встроенных функций не работают с autodie
, который более или менее ограничен IO-вызовами, fork
, system
и exec
, даже здесь он неполный: print
и flock
не работают с autodie
. Вне этого никакая другая встроенная функция Perl не работает с autodie
. Вычисление значений из пустого массива не заставляет мою программу кричать. Немногие модули проверяют статус autodie
, чтобы увидеть, должны ли их функции или методы croak
вместо возврата ложных значений. Итак, вся идея превратить Perl в язык, основанный на исключениях, не происходит.
Даже те места, где вы думаете, autodie
будут работать, просто нет. Если вы используете File::Copy
для получения команд copy
и move
, не зависеть от autodie
, чтобы поймать неудачную копию файла. Вам еще нужно проверить возвращаемое значение copy
. Если вы используете File::IO
, все ставки с autodie
отключены.
Итак, autodie
не совсем соответствует своему смелому обещанию превратить Perl в более основанный на исключениях язык программирования. Для большинства людей он обычно улавливает open
заявления, и у большинства разработчиков нет проблем с open ... or die...
.
Мне нравится подход, основанный на исключениях, для разработки, и я считаю, что все модули должны по ошибке зацикливаться на ошибке. Заставляйте разработчиков обрабатывать исключения вместо их игнорирования. Я пишу свои модули и функции, чтобы кричать, когда есть проблемы, и использовать eval
для обработки исключений. К сожалению, autodie
просто не делает много всего прямо сейчас.