Почему я должен использовать Carp вместо warn в Perl? - PullRequest
26 голосов
/ 09 октября 2008

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

Ответы [ 4 ]

41 голосов
/ 09 октября 2008

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

#!/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

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

22 голосов
/ 09 октября 2008

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

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

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

12 голосов
/ 09 октября 2008

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

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

8 голосов
/ 09 октября 2008

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

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

...