当前位置:  开发笔记 > 编程语言 > 正文

我怎么能处理一个死的perl构造函数?

如何解决《我怎么能处理一个死的perl构造函数?》经验,为你挑选了1个好方法。

代码段:

my $tz = DateTime::TimeZone->new(name => 'America/San_Francisco');

这会立即死亡,因为America/San_Francisco它不是公认的时区.

打印以下消息:

无法加载时区'America/San_Francisco',或者名称无效.

我想在脚本退出之前处理此错误并为用户打印其他信息.我尝试过使用unless,但没有运气die.

如何才能做到这一点?



1> mob..:

使用eval { ... }$@捕获和管理致命错误.

my $tz = eval { DateTime::TimeZone->new(name => 'America/San_Francisco') };
if (!$tz) {
    if ($@ =~ /The timezone .* could not be loaded/) {
        warn "Choose a timezone from ", 
            "https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List";
    } else {
        warn "Error in DateTime::TimeZone constructor: $@";
    }
    exit 1;
}


尝试:: Tiny比evals更安全.
@choroba,`我的$ tz = eval {...}或者做{...};`就足够了,因为`DateTime :: TimeZone-> new`总是返回一个真值.
`我的$ tz; eval {$ tz = ....; 1}或者{if($ @ = ~`更安全.` $ @`可能会在某些Perl版本中被破坏.请参阅[Try :: Tiny](http://p3rl.org/Try::Tiny)和[ 5.14之前的评估中的错误](http://www.perlmonks.org/?node_id=1153468).
推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有