Подтвердить что ты не робот

Должен ли модуль Perl создавать исключения (die/croak)?

При написании модуля Perl целесообразно использовать croak/die внутри модуля?

В конце концов, если вызывающий абонент не использует блок eval, модуль может сбой программы, вызывающей его.

Какова наилучшая практика в этих случаях?

4b9b3361

Ответ 1

Обычно я предпочитаю исключения, если вы указываете какую-либо ошибку. В противном случае вам придется потратить гораздо больше времени на обработку кода обработки ошибок на разных уровнях вашей кодовой базы, а не на централизацию обработки ошибок в соответствующих слоях системы - среди прочих причин.

Вы можете найти этот старый поток на 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);
    
  • Ясность

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

  • Разделение проблем. Условие ошибки и обработчик ошибок - разные идеи.

    • Вы можете потребовать, чтобы ошибка обрабатывалась по-разному в зависимости от контекста.

    • Вы также можете не знать, как следует обрабатывать ошибку в той точке, в которой она встречается.

    • Возможно, вы не знаете, как следует обрабатывать ошибку во время написания кода.

    С помощью стиля кода возврата-ошибки вам придется либо:

    • Предотвращать ошибки, при которых может быть принято решение о том, как их обрабатывать.

    • обработчики ошибок распространения до того места, где могут возникать ошибки

    Оба параметра быстро становятся беспорядочными, если между условием ошибки и обработчиком ошибок существует много уровней кода.

  • Нет путаницы между возвращаемыми значениями и условиями ошибки.

Есть, вероятно, еще несколько: -)

Ответ 2

По крайней мере, на ранних стадиях производства мне нравится иметь много исключений для броска (ранний девиз). Поэтому я могу быстро поймать любую ошибку (и сэкономить вам много времени, избегая думать в логике и отслеживать коды возврата). Затем в каждой итерации релиза я могу уменьшить тяжесть бросков, связывая их с состоянием $o- > debug. Поэтому, когда вы запускаете свои тесты, умирайте во всем, но когда вы запускаете свой код для реального каркаса вместо этого в журнал и умираете только тогда, когда происходят неизбежные фатальные условия. По моему скромному мнению, это более гибко, чем возвращаемые коды, которые я использовал в старые времена.

Также простое исключение "die" иногда не очень полезно, поэтому лучше иметь функцию throw, которая печатает всю трассировку стека вызовов (например, Carp- > confess() | cluck()).

И хороший механизм ловли также удобен. используйте Try:: Tiny или TryCatch.

PD: поток perlmonk, на который указывает adrianh, является классическим.