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

Как насчет этого?

def all_occurences(file, str):
    initial = 0
    file = file.replace('\n', ' ')
    while True:
      initial = file.find(str, initial)
      if initial == -1: return
      yield initial
      initial += len(str)
26
задан Frew Schmidt 9 October 2008 в 19:10
поделиться

4 ответа

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

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

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

41
ответ дан 28 November 2019 в 06:14
поделиться

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

Damian рекомендует Carp вместо warn в "Создании отчетов об Отказе" в Лучшие практики Perl , но не делает различие между сценариями как конструкции кода верхнего уровня и модули как компоненты то использование программ.

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

22
ответ дан 28 November 2019 в 06:14
поделиться

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

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

12
ответ дан 28 November 2019 в 06:14
поделиться

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

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

8
ответ дан 28 November 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: