Spec-Zone.ru › Perl 5.36

autodie

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНОПСИС
  • ОПИСАНИЕ
  • ИСКЛЮЧЕНИЯ
  • КАТЕГОРИИ
  • ЗАМЕЧАНИЯ, СВЯЗАННЫЕ С ФУНКЦИЯМИ
    • print
    • flock
    • system/exec
  • ЛОВУШКИ
  • ДИАГНОСТИКА
  • Советы и рекомендации
    • Импортирование autodie в другое пространство имён, отличное от "caller"
  • ОШИБКИ
    • autodie и строковый eval
    • СООБЩЕНИЕ ОБ ОШИБКАХ
  • ОБРАТНАЯ СВЯЗЬ
  • АВТОР
  • ЛИЦЕНЗИЯ
  • СМОТРИТЕ ТАКЖЕ
  • ПРИЗНАТЕЛЬНОСТИ

ИМЯ

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 предоставляет удобный способ заменить функции, которые обычно возвращают ложь при ошибке, эквивалентами, которые выбрасывают исключение при ошибке.

Предикат 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);

ЗАМЕЧАНИЯ, СВЯЗАННЫЕ С ФУНКЦИЯМИ

print

Предикат autodie не проверяет вызовы print.

flock

Не считается ошибкой, если flock возвращает ложь из-за условия EWOULDBLOCK (или эквивалентного). Это означает, что можно по-прежнему использовать общепринятую практику проверки возвращаемого значения flock при вызове с параметром LOCK_NB:

use autodie;

if ( flock($fh, LOCK_EX | LOCK_NB) ) {
    # We have a lock
}

Автоматическое применение flock сгенерирует исключение, если flock возвращает ложь с другой ошибкой.

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 в другое пространство имён, отличное от "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 по адресу https://github.com/pjf/autodie/issues.

ОБРАТНАЯ СВЯЗЬ

Если вы нашли этот модуль полезным, пожалуйста, оцените его на сайте 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 советы, 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.36.0/autodie

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API