При написании модуля Perl целесообразно использовать croak/die внутри модуля?
В конце концов, если вызывающий абонент не использует блок eval, модуль может сбой программы, вызывающей его.
Какова наилучшая практика в этих случаях?
При написании модуля Perl целесообразно использовать croak/die внутри модуля?
В конце концов, если вызывающий абонент не использует блок eval, модуль может сбой программы, вызывающей его.
Какова наилучшая практика в этих случаях?
Обычно я предпочитаю исключения, если вы указываете какую-либо ошибку. В противном случае вам придется потратить гораздо больше времени на обработку кода обработки ошибок на разных уровнях вашей кодовой базы, а не на централизацию обработки ошибок в соответствующих слоях системы - среди прочих причин.
Вы можете найти этот старый поток на perlmonks полезным чтением. Я воспроизведу свой комментарий ниже: поскольку я в основном согласен с тем, что я написал тогда: -)
Некоторые причины, по которым мне нравятся исключения:
грубости. Я могу забыть проверить возвращаемое значение ошибки. Я не могу забыть проверить исключение.
. Я предпочитаю:
$o->foo->bar->fribble->ni
к
$o->foo or return(ERROR_FOO);
$o->bar or return(ERROR_BAR);
$o->fribble or return(ERROR_FRIBBLE);
$o->ni or return(ERROR_NI);
. С кодом на основе исключений "нормальный" поток управления более явственен, поскольку он не скрывается кодом обработки ошибок. Я думаю, что первый из двух приведенных выше примеров кода показывает намерение кода более непосредственно, чем второй.
Разделение проблем. Условие ошибки и обработчик ошибок - разные идеи.
Вы можете потребовать, чтобы ошибка обрабатывалась по-разному в зависимости от контекста.
Вы также можете не знать, как следует обрабатывать ошибку в той точке, в которой она встречается.
Возможно, вы не знаете, как следует обрабатывать ошибку во время написания кода.
С помощью стиля кода возврата-ошибки вам придется либо:
Предотвращать ошибки, при которых может быть принято решение о том, как их обрабатывать.
обработчики ошибок распространения до того места, где могут возникать ошибки
Оба параметра быстро становятся беспорядочными, если между условием ошибки и обработчиком ошибок существует много уровней кода.
Нет путаницы между возвращаемыми значениями и условиями ошибки.
Есть, вероятно, еще несколько: -)
По крайней мере, на ранних стадиях производства мне нравится иметь много исключений для броска (ранний девиз). Поэтому я могу быстро поймать любую ошибку (и сэкономить вам много времени, избегая думать в логике и отслеживать коды возврата). Затем в каждой итерации релиза я могу уменьшить тяжесть бросков, связывая их с состоянием $o- > debug. Поэтому, когда вы запускаете свои тесты, умирайте во всем, но когда вы запускаете свой код для реального каркаса вместо этого в журнал и умираете только тогда, когда происходят неизбежные фатальные условия. По моему скромному мнению, это более гибко, чем возвращаемые коды, которые я использовал в старые времена.
Также простое исключение "die" иногда не очень полезно, поэтому лучше иметь функцию throw, которая печатает всю трассировку стека вызовов (например, Carp- > confess() | cluck()).
И хороший механизм ловли также удобен. используйте Try:: Tiny или TryCatch.
PD: поток perlmonk, на который указывает adrianh, является классическим.