在没有本地化$ @一个bug的情况下,在CPAN模块中进行“eval”吗?

时间:2010-06-01 12:13:33

标签: perl exception eval

我想我在Params::Validate遇到了一个错误,但我不确定我是否正确识别出有问题的代码。有问题的代码无法在链中传递异常(使用Try::Tiny),因此我开始调试并发现try块中使用的类具有析构函数。这个析构函数调用使用Params::Validate并查看Validate.pm source的对象方法,我看到eval没有$@本地化,即全局$@得到覆盖。

现在我看到两个选项:

  1. Params::Validate应始终本地化$@,因此这是一个应该报告的错误。
  2. 该错误存在于相关类中,因为它不应在析构函数中使用Params::ValidateParams::Validate可以保持原样。
  3. 是哪一个?我该如何处理这种情况?

    PS:我认为CPAN模块应该坚如磐石,既不会破坏自己也不会破坏环境,因此问题标题。

2 个答案:

答案 0 :(得分:11)

有关如何提交错误报告,请参阅http://search.cpan.org/perldoc?Params::Validate#SUPPORT。您花了很多精力发现问题的原因和解决方案。如果其他人不知道你已经学到了什么就必须回溯你的步骤,那将是一种耻辱。

  

我认为CPAN模块应该坚如磐石,既不会破坏自己也不会破坏环境

在一个完美的世界中,软件总会做它声称要做的事情而没有任何无证的副作用。 CPAN是一个非常开放的系统,几乎任何人都可以上传几乎任何东西。我认为这更像是一个功能而不是一个错误 - 进入门槛低,这使得开发Perl模块变得更容易,并且鼓励开发更加丰富且更有用的库。

Params::Validate九年前发布,自那时以来已经更新了大约94次。如果你查看CHANGES文件,你会发现作者一直非常认真地保持模块的最新状态并修复偶尔出现的问题以及添加新功能。听到用户发现问题可能不会让他们感到震惊,也不会因为发现某些库只是优秀且不完美而感到震惊。

答案 1 :(得分:4)

除非有一些文档告诉您该模块有助于将有意义的评估错误保留为其API的一部分,否则它绝对是一个错误。

  

我认为CPAN模块应该坚如磐石,既不会破坏自己,也不会破坏环境,因此问题标题。

真的打破了什么吗?我可以告诉你这是一个错误,但我不能告诉你,如果没有测试你期望明确的$@并且没有感谢Params::Validate的情况,那么你可以找借口。如果它“打破”了开发环境,那就是测试的目的。