Spec-Zone.ru › Perl 5.30

autodie

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНОПСИС
  • ОПИСАНИЕ
  • ИСКЛЮЧЕНИЯ
  • КАТЕГОРИИ
  • ЗАМЕЧАНИЯ ПО ОСОБЕННОСТЯМ ФУНКЦИЙ
    • print
    • flock
    • system/exec
  • ЛОВУШКИ
  • ДИАГНОСТИКА
  • ОШИБКИ
    • 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 следующий:

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);

ЗАМЕЧАНИЯ ПО ОСОБЕННОСТЯМ ФУНКЦИЙ

print

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

flock

Не считается ошибкой, если flock возвращает ложь в случае ошибки 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.30.3/autodie

Spec-Zone.ru

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