Spec-Zone.ru › Perl 5.34

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

ЗАМЕЧАНИЯ К ФУНКЦИЯМ

print

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

Spec-Zone.ru

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