2017-01-09 57 views
2

代碼片段:我該如何處理死掉的perl構造函數?

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

這立即死亡,因爲America/San_Francisco不是recognized timezone。被印刷

以下消息:

時區「美/ San_Francisco」無法加載,或者是無效的名稱。

我想處理此錯誤,並在腳本退出前爲用戶打印其他信息。我嘗試使用unless,但沒有運氣趕上die

這怎麼辦?

回答

5

使用eval { ... }[email protected]來捕獲和管理致命錯誤。

my $tz = eval { DateTime::TimeZone->new(name => 'America/San_Francisco') }; 
if (!$tz) { 
    if ([email protected] =~ /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: [email protected]"; 
    } 
    exit 1; 
} 
+0

這幾乎工作,但給了我一個奇怪的錯誤: '在./test-die.pl線6從https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List一個時區,第1行。' –

+2

'my $ tz; eval {$ tz = ....; 1}或do {if($ @ =〜〜'更安全,'$ @'可能會在一些Perl版本中被破壞,參見[Try :: Tiny](http://p3rl.org/Try::Tiny)和[在5.14之前版本中的bug)(http://www.perlmonks.org/?node_id=1153468) – choroba

+1

@JonathanCross在字符串的末尾添加一個'\ n',以防止包含該位置。 –

相關問題