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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
26
0
9 721
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

The Carp routines are useful in your own modules because they act like die() or warn(), but with a message which is more likely to be useful to a user of your module. In the case of cluck, confess, and longmess that context is a summary of every call in the call-stack. For a shorter message you can use carp or croak which report the error as being from where your module was called. There is no guarantee that that is where the error was, but it is a good educated guess.

Ответ принят как подходящий

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

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

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

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

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

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

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

Другие вопросы по теме