В чем разница между вариантами «Carp / Croak», «Cluck / Confess» и «подробным»?

49

Я не использовал Carp так много, потому что я вообще катился самостоятельно. Однако, в духе соблюдения модулей Core, я использую его сейчас. Однако кажется, что это едва лучше, чем предупреждать/умирать.

Кроме того, что делает cluck/confess/verbose даже делать? Я запустил этот короткий script, чтобы понять, как выглядит вывод (потому что документы Carp этого делать не делают). Он выглядит точно так же при любом запуске (помимо случайных строк).

  #!/usr/bin/perl

  package Warning;

  sub warning {
    warn "warn";
  }

  package CWarn;
  use Carp qw(carp cluck);

  sub cwarn {
    int(rand(2)) ? carp "carp" : cluck "cluck";
  }

  package Fatal;
  use Carp qw(confess croak);

  sub fatal {
    int(rand(2)) ? confess "confess" : croak "croak";
  }

  package Loop;

  use v5.10;

  sub loop {
    say '=' x 80;
    Warning::warning();
    CWarn::cwarn();
    loop() unless ($c++ > 10);
    Fatal::fatal();
  }

  package main;

  Warning::warning();
  CWarn::cwarn();
  Loop::loop();

UPDATE: Обновлен script с именами пакетов, и это имеет значение. Тем не менее, Carp по-прежнему кажется очень простым с точки зрения информации о регистрации, и он не поддерживает веб-выход. Думаю, я посмотрю на другие, такие как CGI:: Carp, Log:: Output и Log:: Log4Perl.

  • 5
    Вы пробовали читать документацию? Это лучше, чем метод проб и ошибок.
  • 0
    Я не использую свои собственные модули, но я использую объектно-ориентированное программирование, что означает, что я использую пакеты . Даже если вся ваша программа находится в одном файле, но вы определяете классы через package , вы найдете удобный carp и croak . как указано CMJ .
Показать ещё 2 комментария
Теги:
error-handling
carp

2 ответа

123
Лучший ответ

Проблема с вашим примером заключается в том, что все ваши подсайты находятся в одном пакете (пакет по умолчанию: main). Это не тот вариант использования Carp.

Карп предназначен для использования в модулях. Причина в том, что когда модуль сталкивается с проблемой, это часто происходит потому, что вызывающий модуль передал ему плохие данные. Поэтому вместо того, чтобы сообщать о линии, в которой модуль обнаружил проблему, обычно более полезно сообщать о строке, в которой был вызван модуль (из кода вне модуля). Это то, что делают функции, экспортируемые Carp.

Есть два набора параметров да/нет. Функция может быть фатальной (например, die) или нефатальной (например, warn). Он может сообщать только о строке, в которой была вызвана функция, или может сообщать полную обратную трассировку.

         Fatal  Backtrace
carp       N        N
cluck      N        Y
croak      Y        N
confess    Y        Y

Опция verbose принудительно возвращает backtraces. То есть, carp действует как cluck, а croak действует как confess. Вы можете использовать это, когда понимаете, что вам нужна дополнительная информация для отладки, но не хотите менять код для использования confess.

  • 2
    Отличное резюме
  • 1
    Большой! +1 за урок!
22

Carp лучше, чем warn/die, поскольку он отображает файл и строку того, что называется функцией, бросающей ошибку, а не просто там, где была вызвана ошибка. Это часто может быть полезно для библиотек. (Например, библиотека базы данных должна, вероятно, передавать ошибки, указывающие, где ошибочный вызов базы данных, а не указывать строку внутри себя.)

Carp, cluck, croak и confess предоставляют четыре комбинации параметров:

  • Carp: не фатальный, нет backtrace
  • cluck: не смертельно, с backtrace
  • croak: фатальный, без backtrace
  • confess: фатальный, с backtrace

Ещё вопросы

Сообщество Overcoder
Наверх
Меню