分配给$是否合乎犹太教!用Perl?

分配给$是否合乎犹太教!用Perl?,perl,error-handling,Perl,Error Handling,可以分配给$吗!关于Perl中的一个错误 例如: if( ! (-e $inputfile)) { $! = "Input file $inputfile appears to be non-existent\n"; return undef; } 这样我可以在顶层处理所有错误 谢谢。是的,您可以将内容(#)分配给$!,只需小心操作的位置,以免弄乱其他一些功能信息。好吧,基本上说,这是系统错误的指标。所以我不会分配给它,你只是让你的库的用户生气 请改用异常: eval

可以分配给$吗!关于Perl中的一个错误

例如:

if( ! (-e $inputfile))
{
      $! = "Input file $inputfile appears to be non-existent\n";
      return undef;
}
这样我可以在顶层处理所有错误

谢谢。

是的,您可以将内容(#)分配给$!,只需小心操作的位置,以免弄乱其他一些功能信息。

好吧,基本上说,这是系统错误的指标。所以我不会分配给它,你只是让你的库的用户生气

请改用异常:

eval { # this ain't the evil eval
   # some code
   die $something;
}
if (my $err = $@) {
   # exception handling
}

请注意,你可以“扔”,或死亡,与任何你需要

如果分配给$!,它被放置在系统errno变量中,该变量只接受数字。所以你实际上可以做到:

use Errno "EEXIST";
$! = EEXIST;
print $!;
并获取已定义的系统错误号的字符串值,但您无法执行所需操作-将其设置为任意字符串。这样的字符串将使您得到一个参数“…”在标量赋值警告中不是数字,并将errno设置为0


另一个问题是美元!可以通过任何系统调用进行更改。因此,在您进行打印或其他任何操作之前,您只能相信它具有您设置的值。您可能需要自己的错误变量。

我的拉比说“不!”

设置
$可以,但是:

  • 你应该在你的功能结束时做
  • 您应该返回一个指示发生错误的不同值
  • 您应该使用操作系统的errno值而不是字符串进行设置
  • 检查代码需要在函数出现故障时立即检查值(并且仅当函数指示故障时)

需要记住的是,它使用的值是$!对于其退出代码(只要它不是零)。

如果只有一个变量来存储错误,那么在检查错误变量的状态之前,如果程序中发生了多个错误,则会出现问题。如果你能帮助的话,那是值得避免的

谢天谢地,在Perl中您可以帮助它。一个非常好的解决方案是从中使用面向对象的异常处理。此模块允许您编写try/catch块,如下所示:

try {
    some code;
    code that might thrown an exception;
    more code;
    return;
}
catch Error with {
    my $ex = shift;   # Get hold of the exception object
    # handle the exception;
};

这个模块的设计非常好,并且有一篇关于这个主题的文章

$!有太多的警告,作为一个全局变量,许多函数都分配给它(其中一些是Perl调用的C函数),因此我只需抛出一个异常(在Perl中这意味着死亡),并让用户捕获它(如果他们关心的话)。因此,与其写:

$obj->foo or die $!;
$obj->bar or die $!;
$obj->baz or die $!;
甚至

$obj->foo or die $obj->error;
$obj->bar or die $obj->error;
$obj->baz or die $obj->error;
你可以直接写

$obj->foo;
$obj->bar;
$obj->baz;
要知道,如果有错误,你会被告知的。此外,你上面的任何人都会得到通知,并可以捕获它。因为这是最常见的情况,所以用户无需记住它并一遍又一遍地键入它,就可以实现它

如果要忽略错误或从错误中恢复,只需使用
eval BLOCK

eval { $obj->foo };   # don't care if it works or not
eval { $obj->bar } or do { ...something when it doesn't work... };
由于这是一种例外情况,因此用户必须记住添加更多代码并进行更多工作


这种方法的示例包括:默认情况下,只有向后兼容才禁用该选项,以及奇妙的模块。

以美元为单位的值!除非在函数调用之后立即对其进行检查,否则不能保证为任何值。失败和b。声称使用errno。所以,任何一个被制造出来的人都会做错事。就像FYI一样,很多人认为在图书馆里使用“死亡”是一个非常愚蠢的事情。使用_error/_errors标志和适当的访问器方法(理想情况下,一个用于快速真/假检查,另一个用于打印错误列表)。最好在对象级别上这样做:)@DVK我强烈反对。库最好抛出异常,只要它们确实是异常的,并且您记录了如何处理错误,并且对此保持一致。为什么?库的用户希望知道何时出现错误。大多数情况下,如果真的有,他们就会死。这会导致到处写“$obj->method或die$obj->error”。你会变得懒惰,忘记并错过一个错误。异常意味着您只需在希望从错误中恢复的位置添加特殊代码。使用autodie一段时间,你就会明白。我很想投票支持这一点,但事实上这是犹太教的,所以答案是错误的,不能投票支持:-)。这里的教训是不要在这个问题上相信拉比,除非他也知道PerlThanks,因为他看到了我拙劣的幽默尝试!根据犹太教教士和犹太教的严格定义,分配给$!不受犹太教特定法律的保护,因此它不是“犹太教”的。但是,这对你们外邦人来说可能是允许的。我希望有人编辑这个问题的标题,所以在这里先发制人地指出,原来的标题是“在Perl中分配给$!是否是犹太教的?”。获胜者是。。。“这有点令人惊讶。”丹尼斯,我认为法律没有涵盖的东西默认是犹太的。例如,没有关于计算机(除了在安息日用电)、吸烟(同样,在安息日点火除外)或日光浴的法律,但它们都是符合犹太教的。我认为分配$!:-)也是如此我认为Perl根本不会被认为是犹太教徒……;)我支持使用异常,但不要使用错误。使用它,它的功能更强。