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

Jon*_*oss 2 error-handling perl die

代码段:

my $tz = DateTime::TimeZone->new(name => 'America/San_Francisco');
Run Code Online (Sandbox Code Playgroud)

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

打印以下消息:

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

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

如何才能做到这一点?

mob*_*mob 5

使用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;
}
Run Code Online (Sandbox Code Playgroud)

  • 尝试:: Tiny比evals更安全. (3认同)
  • @choroba,`我的$ tz = eval {...}或者做{...};`就足够了,因为`DateTime :: TimeZone-> new`总是返回一个真值. (3认同)
  • `我的$ tz; eval {$ tz = ....; 1}或者{if($ @ = ~`更安全.` $ @`可能会在某些Perl版本中被破坏.请参阅[Try :: Tiny](http://p3rl.org/Try::Tiny)和[ 5.14之前的评估中的错误](http://www.perlmonks.org/?node_id=1153468). (2认同)