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 следующий:
use feature qw(switch);
eval {
use autodie;
open(my $fh, '<', $some_file);
my @records = <$fh>;
# Do things with @records...
close($fh);
};
given ($@) {
when (undef) { say "No error"; }
when ('open') { say "Error from open"; }
when (':io') { say "Non-open, IO error."; }
when (':all') { say "All other autodie errors." }
default { say "Not an autodie error at all." }
} В Perl 5.8 структура given/when недоступна, поэтому можно использовать следующую структуру:
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 возвращает значение выхода вместо содержимого $?.
Дополнительные разрешённые значения выхода можно указать в качестве необязательного первого аргумента к функции 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 или 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 Request Tracker по адресу https://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie.
ОБРАТНАЯ СВЯЗЬ
Если вы считаете этот модуль полезным, пожалуйста, оцените его на сайте CPAN Ratings по адресу http://cpanratings.perl.org/rate?distribution=autodie .
Автор модуля рад узнать, как autodie улучшил (или ухудшил) вашу жизнь. Обратную связь можно отправить по адресу <pjf@perltraining.com.au>.
АВТОР
Авторские права 2008-2009, Пол Фенвик <pjf@perltraining.com.au>
ЛИЦЕНЗИЯ
Этот модуль — свободное программное обеспечение. Вы можете распространять его на тех же условиях, что и сам Perl.
СМОТРИТЕ ТАКЖЕ
Fatal, autodie::exception, autodie::hints, IPC::System::Simple
Perl tips, autodie на http://perltraining.com.au/tips/2008-08-20.html
ПРИЗНАТЕЛЬНОСТЬ
Марк Рид и Роланд Гирзиг — переводчики на клингонский язык.
Полный список авторов см. в файле AUTHORS. Последняя версия этого файла находится по адресу https://github.com/pjf/autodie/tree/master/AUTHORS .
© 1993–2020 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.28.3/autodie