Perl模块是否应该引发异常(die/croak)?

fre*_*die 12 perl module exception

在编写Perl模块时,在模块中使用croak/die是一个好习惯吗?

毕竟,如果调用者没有使用eval块,模块可能会使调用它的程序崩溃.

在这些情况下,最佳做法是什么?

adr*_*anh 11

如果您指出某种错误,我通常更喜欢例外情况.否则,您需要花费更多时间在代码库的不同级别上处理错误处理代码,而不是将错误处理集中在系统的适当层中 - 除其他原因外.

您可能会在perlmonks上发现这个旧线程是一个有用的读物​​.我将在下面重现我的评论 - 因为我大多赞同我当时所写的内容:-)


我喜欢例外的一些原因:

  • 鲁棒性.我可以忘记检查返回的错误值.我不能忘记检查一个例外.

  • 简洁.我更喜欢:

    $o->foo->bar->fribble->ni
    
    Run Code Online (Sandbox Code Playgroud)

    $o->foo or return(ERROR_FOO);
    $o->bar or return(ERROR_BAR);
    $o->fribble or return(ERROR_FRIBBLE);
    $o->ni or return(ERROR_NI);
    
    Run Code Online (Sandbox Code Playgroud)
  • 明晰.对于基于异常的代码,"正常"控制流更加明确,因为它不会被错误处理代码遮挡.我认为上面两个代码示例中的第一个示例比第二个更直接地显示了代码的意图.

  • 关注点分离.错误条件和错误处理程序是不同的想法.

    • 您可能希望根据上下文以不同方式处理错误.

    • 您可能也不知道如何在发生错误时处理错误.

    • 您可能不知道在编写代码时应如何处理错误.

    使用返回错误代码样式,您最终必须:

    • 传播错误条件,以便决定如何处理它们.

    • 将错误处理程序传播到可能发生错误的位置

    如果错误条件和错误处理程序之间存在许多级别的代码,则这两个选项会迅速变得混乱.

  • 返回值和错误条件之间没有混淆.

可能还有一些;-)