Лучше ли каркать () или умирать (), когда в Perl происходит что-то плохое? - PullRequest
16 голосов
/ 11 ноября 2010

perlcritic жалуется на то, что следующий код, некоторые типовые элементы DBI, которые прекрасно работают, должен croak вместо die:

# Connect to database
my $db_handle = DBI->connect( $url, $user, $password ) or die $DBI::errstr;

Все это, в то время как die, кажется, работает нормально для меня.

Я бы подумал, что для самурайского воина Perl квакают менее благородно, чем на самом деле умирать, когда дела идут плохо. Шутки врозь

Почему я должен croak вместо die?

Каковы последствия невнимания совета перкритика ?

Ответы [ 5 ]

31 голосов
/ 11 ноября 2010

С http://www.perlmonks.org/?node_id=685452

Вы используете die, когда ошибка - это то, что вы или ваш код сделали неправильно.Вы используете карканье, когда ваш собеседник поступает неправильно.умри "ошибка: $!"указывает, что ошибка находится на линии, где произошла ошибка.каркаю "ошибка: $!"означает, что ошибка находится на линии, где вызывающий абонент вызвал ваш код.

В этом случае ошибка (ошибка подключения к БД) не имеет ничего общего с вызывающим абонентом и все, что связано с созданием строкисоединение, поэтому я бы использовал die.

7 голосов
/ 11 ноября 2010

Я обычно использую следующее:

  • die "string" для фатальных сообщений, которые вы хотите напрямую сообщить пользователю. Я в основном это делаю в сценариях.
  • die $object для объектов полного исключения, хотя большинство классов исключений будет иметь метод throw, который сделает это за вас. Это для того, чтобы ваш абонент мог определить, какую ошибку вы выдавали, и, возможно, даже извлечь из нее информацию. Если вы используете Moose , проверьте Throwable и Throwable-X
  • croak "message", как сказал Адриан, для случая, когда ваш пользователь сделал что-то не так, и вы хотите сообщить об ошибке в любом вызываемом вами коде. Для этого обычно используются функции и методы уровня API.
  • confess "message" для библиотечных ошибок, где я пока не вижу полезности исключения. Обычно это ошибки времени выполнения, которые вы считаете ошибкой, а не исключительным условием. Может иметь смысл использовать исключения для них, особенно если у вас есть большой проект, который уже использует исключения. Но это хороший, приятный и простой способ получить трассировку стека с ошибкой.
3 голосов
/ 11 ноября 2010

Не обязательно неправильно использовать die(), но croak() дает вам или вашему пользователю гораздо больше информации о том, что пошло не так.Есть также переменные, которые можно установить в пространстве имен Carp, которые могут изменить этот вывод, чтобы получить больше или меньше информации.

Это эквивалентно die(), но с дополнительной информацией и контролем.

2 голосов
/ 13 июля 2016

Если бы мы назвали die и croak за пределами функции, то нет Разница между этими функциями.

Мы можем найти разницу только тогда, когда мы называем умри и квакай в любом другая функция.

croak выдаст информацию о вызывающем абоненте, такую ​​как имя функции и номер строки .. и т. д. die выдаст ошибку и даст номер строки, где произошла ошибка.

0 голосов
/ 19 мая 2012

Тем не менее.В этом примере может потребоваться использовать croak, если параметры подключения были получены непосредственно от входов в функцию, как указали другие.

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

Если очень сложно проверить состояние ошибки, это может быть причиной смерти за хрип.Но любой параметр проверки ошибок должен использовать квакающий.

...