gpt4 book ai didi

perl - 如果Moose构建器方法失败,该怎么办?

转载 作者:行者123 更新时间:2023-12-04 03:13:57 26 4
gpt4 key购买 nike

处理构建器方法失败的最佳方法是什么?

例如:

package MyObj;
use Moose;
use IO::File;

has => 'file_name' ( is => 'ro', isa => 'Str', required =>1 );
has => 'file_handle' ( is => 'ro', isa => 'IO::File', lazy_build => 1 );

sub _build_file_handle {
my $self = shift;
my $fh = IO::File->new( $self->file_name, '<' );

return $fh;
}

如果 _build_file_handle无法获取句柄,则构建器将返回 undef,这将失败类型约束。

我可以在 file_handle类型约束中使用并集,以便它将接受 undef作为有效值。但是,即使值是 has_file_handle,谓词 undef也将返回true。

有没有办法表明生成器发生故障,并且该属性应保持清除状态?

最佳答案

“最佳”是主观的,但是您必须决定在代码中哪个更有意义:

  • 如果您可以在文件句柄构建失败时继续执行代码(即这是可恢复的条件),则构建器应返回undef并将类型约束设置为'Maybe[IO::File]'。这意味着您在使用该属性时还必须检查该属性的定义性。您还可以检查BUILD是否正确构建了此属性,然后选择在此时采取进一步的措施(如弗里多在他的评论中提到的那样),例如如果它是undef,则调用clear_file_handle(因为构建器将始终为该属性分配一个值,假设它当然不会死)。
  • 否则,通过显式引发异常(您可以选择追上更高的异常),或者简单地返回undef并让类型约束失败,使构建器失败。无论哪种方式,您的代码都会死掉;您只需要选择如何死亡以及堆栈跟踪的数量即可。 :)

  • PS。您可能还想看看Moose内部使用的 Try::Tiny,它基本上只是 do eval { blah } or die ...惯用语的包装。

    *但是做对了!并且以一种很酷的方式! (我似乎听见#moose在我耳边窃窃私语..)

    关于perl - 如果Moose构建器方法失败,该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2164614/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com