Лучше ли каркать() или умереть(), когда что-то плохое происходит в 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.