Лучше ли каркать() или умереть(), когда что-то плохое происходит в Perl?

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

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

Все это, в то время как ум, кажется, отлично работает для меня.

Я бы подумал, что для воинов-самураев Perl, каркас менее почетный, чем на самом деле умирает, когда все идет наперекосяк. Анекдоты

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

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

Ответ 1

От http://www.perlmonks.org/?node_id=685452

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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