Подтвердить что ты не робот

Почему я должен использовать Carp вместо предупреждения в Perl?

Люди продолжают давать мне примеры с карпом, а не предупреждать. Зачем? Что делает карпа лучше, чем предупреждать?

4b9b3361

Ответ 1

carp дает вам больше информации о том, откуда приходит сообщение (контекст)

#!/usr/bin/perl

use Carp;

foo();
bar();
baz();

sub foo {
  warn "foo";
}

sub bar {
  carp "bar";
}

sub baz {
  foo();
  bar(); 
}

производит

foo at ./foo.pl line 9.
bar at ./foo.pl line 13
        main::bar() called at ./foo.pl line 6
foo at ./foo.pl line 10.
bar at ./foo.pl line 14
        main::bar() called at ./foo.pl line 19
        main::baz() called at ./foo.pl line 7

глупо для этой небольшой программы, но пригодится, когда вы хотите узнать, кто назвал метод, который работает.

Ответ 2

Я использую warn для скриптов и простых программ, а Carp - внутри любых модулей. Подпрограммы Carp используют имя файла и номер строки, где была вызвана ваша текущая подпрограмма, чтобы было легче найти, кто вызывает проблему (не только там, где проблема проявилась).

Дамиан рекомендует Carp вместо warn в "Отчете отчетов" в Perl Best Practices, но не делает различия между сценариями как конструкторы кода верхнего уровня и модули как компоненты, которые программы.

В последнее время меня больше не волнует, потому что я использовал Log:: Log4perl, чтобы обрабатывать все это.

Ответ 3

carp работает лучше для отладки внутри модулей. Если вы пишете только простой script, нет никакой пользы. Из документация Карпа:

Подпрограммы Carp полезны в ваших собственных модулях, потому что они действуют как die() или warn(), но с сообщением, которое более вероятно будет полезно для пользователя вашего модуля. В случае cluck, confess и longmess этот контекст представляет собой сводку каждого вызова в стеке вызовов. Для более короткого сообщения вы можете использовать carp или croak, которые сообщают об ошибке как от того, откуда был вызван ваш модуль. Нет никакой гарантии, что именно там была ошибка, но это хорошая образованная догадка.

Ответ 4

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

Большинство авторов используют warn в сценариях и Carp в модулях. Иногда я использую warn внутри модуля, когда я хочу, чтобы сообщение об ошибке отражало проблему в реализации модуля (например, случай, который он должен поддерживать, но не делает этого). Можно утверждать, что cluck будет лучше в таких ситуациях, как он обеспечивает полный стек backtrace.