加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 22:01:34 所属栏目:大数据 来源:网络整理
导读:在构建器方法中处理故障的最佳方法是什么? 例如: 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 $sel
在构建器方法中处理故障的最佳方法是什么?

例如:

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类型约束中使用union,这样它将接受一个undef作为一个有效的值.但是,即使值为undef,谓词has_file_handle将返回true.

有没有办法表明构建器失败,属性应该保持清除?

解决方法

“最好的”是主观的,但你必须决定哪一个更适合你的代码:

>如果在文件句柄无法构建时(即,它是可恢复的条件)可以继续执行代码,构建器应返回undef并将类型约束设置为“可能[IO :: File]”.这意味着,每当使用该属性时,您还必须检查该属性的定义.您还可以检查此属性是否在BUILD中正确构建,并选择在该点进行进一步的操作(如他在评论中提到的F??riedo),例如调用clear_file_handle(如果它是undef)(因为构建器总是为属性赋值,假设它不会死).
>否则,让构建器失败,无论是通过显式地抛出一个异常(你可以选择抓到更高的),或者简单地返回undef并让类型约束失败.无论哪种方式你的代码都会死亡你只需要选择它如何死亡,堆栈跟踪是多么庞大.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读