autodie
СОДЕРЖАНИЕ
- ИМЯ
- СИНТАКСИС
- ОПИСАНИЕ
- ИСКЛЮЧЕНИЯ
- КАТЕГОРИИ
- ЗАМЕЧАНИЯ К ФУНКЦИЯМ
- ЛОВУШКИ
- ДИАГНОСТИКА
- Советы и хитрости
- ОШИБКИ
- ОТЗЫВЫ
- АВТОР
- ЛИЦЕНЗИЯ
- СМОТРИТЕ ТАКЖЕ
- БЛАГОДАРНОСТИ
ИМЯ
autodie - Замена функций на те, которые либо завершаются успешно, либо вызывают ошибку с лексическим охватом
СИНТАКСИС
use autodie; # Recommended: implies 'use autodie qw(:default)'
use autodie qw(:all); # Recommended more: defaults and system/exec.
use autodie qw(open close); # open/close succeed or die
open(my $fh, "<", $filename); # No need to check!
{
no autodie qw(open); # open failures won't die
open(my $fh, "<", $filename); # Could fail silently!
no autodie; # disable all autodies
}
print "Hello World" or die $!; # autodie DOESN'T check print! ОПИСАНИЕ
bIlujDI' yIchegh()Qo'; yIHegh()!
It is better to die() than to return() in failure.
-- Klingon programming proverb. Предикат autodie предоставляет удобный способ замены функций, которые обычно возвращают false при неудаче, на эквиваленты, выбрасывающие исключение при неудаче.
Предикат autodie имеет лексический охват, что означает, что функции и подпрограммы, изменённые с помощью autodie, будут изменять своё поведение только до конца окружающего блока, файла или eval.
Если system указан в качестве аргумента для autodie, то он использует IPC::System::Simple для выполнения основной работы. Более подробная информация содержится в описании этого модуля.
ИСКЛЮЧЕНИЯ
Исключения, сгенерированные предикатом autodie , являются членами класса autodie::exception. Предпочтительный способ работы с этими исключениями в Perl 5.10 выглядит следующим образом:
eval {
use autodie;
open(my $fh, '<', $some_file);
my @records = <$fh>;
# Do things with @records...
close($fh);
};
if ($@ and $@->isa('autodie::exception')) {
if ($@->matches('open')) { print "Error from open\n"; }
if ($@->matches(':io' )) { print "Non-open, IO error."; }
} elsif ($@) {
# A non-autodie exception.
} Для получения дополнительной информации об обработке исключений см. autodie::exception.
КАТЕГОРИИ
Autodie использует простую систему категорий для группировки схожих встроенных функций. Запрос типа категории (начинающийся с двоеточия) активирует autodie для всех встроенных функций в рамках этой категории. Например, запрос :file активирует autodie для close, fcntl, open и sysopen.
В настоящее время категории:
:all
:default
:io
read
seek
sysread
sysseek
syswrite
:dbm
dbmclose
dbmopen
:file
binmode
close
chmod
chown
fcntl
flock
ioctl
open
sysopen
truncate
:filesys
chdir
closedir
opendir
link
mkdir
readlink
rename
rmdir
symlink
unlink
:ipc
kill
pipe
:msg
msgctl
msgget
msgrcv
msgsnd
:semaphore
semctl
semget
semop
:shm
shmctl
shmget
shmread
:socket
accept
bind
connect
getsockopt
listen
recv
send
setsockopt
shutdown
socketpair
:threads
fork
:system
system
exec Обратите внимание, что, хотя система категорий выше представляет собой строгую иерархию, это не должно восприниматься как аксиома.
Простой use autodie подразумевает use autodie qw(:default). Обратите внимание, что system и exec по умолчанию не включены. system требует наличия необязательного модуля IPC::System::Simple, а включение system или exec сделает их экзотические формы недействительными. Более подробная информация содержится в разделе "ОШИБКИ" ниже.
Синтаксис:
use autodie qw(:1.994); позволяет использовать список :default из конкретной версии. Это обеспечивает удобство использования по умолчанию, но гарантирует отсутствие изменений поведения при обновлении модуля autodie.
autodie может быть включен для всех встроенных функций Perl, включая system и exec, с помощью:
use autodie qw(:all); ЗАМЕЧАНИЯ К ФУНКЦИЯМ
Предикат autodie не проверяет вызовы print.
flock
Не считается ошибкой, если flock возвращает false из-за условия EWOULDBLOCK (или эквивалентного). Это означает, что можно использовать общепринятую практику проверки значения возврата flock при вызове с параметром LOCK_NB:
use autodie;
if ( flock($fh, LOCK_EX | LOCK_NB) ) {
# We have a lock
} Автоматическое применение flock сгенерирует исключение, если flock возвращает false с любой другой ошибкой.
system/exec
Встроенная функция system считается завершившейся с ошибкой в следующих случаях:
-
Команда не стартует.
-
Команда убита сигналом.
-
Команда возвращает ненулевое значение выхода (но см. ниже).
В случае успеха автовызов system возвращает значение выхода, а не содержимое $?.
Дополнительные разрешённые значения выхода можно указать в качестве необязательного первого аргумента для autodying system:
system( [ 0, 1, 2 ], $cmd, @args); # 0,1,2 are good exit values autodie использует модуль IPC::System::Simple для изменения system. Для получения дополнительной информации см. его документацию.
Применение autodie к system или exec приводит к тому, что экзотические формы system { $cmd } @args или exec { $cmd } @args рассматриваются как синтаксическая ошибка до конца лексического области видимости. Если вам действительно нужно использовать экзотическую форму, вы можете вызвать CORE::system или CORE::exec вместо этого или использовать no autodie qw(system exec) перед вызовом экзотической формы.
ЛОВУШКИ
Функции, вызываемые в контексте списка, считаются завершившимися с ошибкой, если они возвращают пустой список или список, состоящий только из одного undef-элемента.
Некоторые встроенные функции (например, chdir или truncate) имеют сигнатуру вызова, которую нельзя полностью представить с помощью прототипа Perl. Это означает, что некоторые допустимые фрагменты Perl-кода будут недопустимы в autodie. Например:
chdir(BAREWORD); Без autodie (и предполагая, что BAREWORD - это открытый файловый дескриптор/дескриптор каталога) это допустимый вызов chdir. Но с autodie, chdir будет вести себя так, как будто у него есть прототип ";$" и, следовательно, BAREWORD будет синтаксической ошибкой ("use strict"). Без strict, он будет интерпретироваться как имя файла.
ДИАГНОСТИКА
- :void не может использоваться с лексическим охватом
-
Параметр
:voidподдерживается в Fatal, но не вautodie. Чтобы обойти это,autodieможет быть явно отключен до конца текущего блока с помощьюno autodie. Чтобы отключить autodie только для одной функции (например, open), используйтеno autodie qw(open).autodieне проверяет вызываемый контекст для определения того, нужно ли выбрасывать исключение; явность обработки ошибок сautodieявляется умышленной особенностью. - Нет пользовательских подсказок, определённых для %s
-
Вы потребовали подсказки для пользовательских подпрограмм, либо добавив
!к имени подпрограммы, либо ранее в списке аргументов дляautodie. Однако у рассматриваемой подпрограммы нет доступных подсказок.
См. также "ДИАГНОСТИКА" в Fatal.
Советы и хитрости
Импорт autodie в другое пространство имён, отличное от "caller"
Возможен импорт autodie в другое пространство имён с помощью Import::Into. Однако для корректной работы вам необходимо передать "глубину вызывающей функции" (а не имя пакета).
ОШИБКИ
Предупреждения "Использовался только один раз" могут быть сгенерированы при использовании autodie или Fatal с файловыми дескрипторами пакета (например, FILE). Вместо этого настоятельно рекомендуется использовать скалярные файловые дескрипторы.
При использовании autodie или Fatal с пользовательскими подпрограммами объявление этих подпрограмм должно появляться до первого использования Fatal или autodie, или они должны быть экспортированы из модуля. Попытка применить Fatal или autodie к другим пользовательским подпрограммам приведёт к ошибке компиляции.
Из-за ошибки в Perl autodie может "потерять" любой формат с таким же именем, что и встроенная или функция autodie.
autodie может не работать корректно, если используется внутри файла с именем, похожим на строковый eval, например, eval (3).
autodie и строковый eval
Из-за текущей реализации autodie, могут наблюдаться неожиданные результаты при использовании рядом или с использованием строковой версии eval. Ни одна из этих ошибок не возникает при использовании блочного eval.
Только в Perl 5.8 autodie не распространяется на строковые eval операторы, хотя его можно явно включить внутри строкового eval.
Только в Perl 5.10 использование строкового eval, когда autodie активен, может привести к утечке поведения autodie в окружающую область видимости. Это можно обойти, используя no autodie в конце области видимости для явного удаления эффектов autodie или избегая использования строкового eval.
Ни одна из этих ошибок не возникает при использовании блочного eval. Использование autodie с блочным eval считается хорошей практикой.
СООБЩЕНИЕ ОБ ОШИБКАХ
Пожалуйста, сообщайте об ошибках через GitHub Issue Tracker по адресу https://github.com/pjf/autodie/issues.
ОТЗЫВЫ
Если вы считаете этот модуль полезным, пожалуйста, оцените его на сайте CPAN Ratings по адресу http://cpanratings.perl.org/rate?distribution=autodie .
Автор модуля с удовольствием узнает, как autodie улучшил (или ухудшил) вашу жизнь. Отзывы можно отправлять на <pjf@perltraining.com.au>.
АВТОР
Copyright 2008-2009, Пол Фенвик <pjf@perltraining.com.au>
ЛИЦЕНЗИЯ
Этот модуль является свободным программным обеспечением. Вы можете распространять его на тех же условиях, что и сам Perl.
СМОТРИТЕ ТАКЖЕ
Fatal, autodie::exception, autodie::hints, IPC::System::Simple
Perl советы, autodie по адресу http://perltraining.com.au/tips/2008-08-20.html
БЛАГОДАРНОСТИ
Марк Рид и Роланд Гирзиг — переводчики на клингонский язык.
Полный список авторов см. в файле AUTHORS. Последняя версия этого файла доступна по адресу https://github.com/pjf/autodie/tree/master/AUTHORS .
© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.34.0/autodie