2016-10-18 43 views
1

當使用Fetch從Teamcity下載url時,我得到一個Fetch失敗!錯誤。但文件的下載實際上起作用。我可以在Perl中禁止fetch.pm中的錯誤消息:

他們最近更改了我們的Teamcity服務器的權限,因此我在獲取要下載的文件的URL時必須使用用戶名和密碼。我只是想知道這是否導致提取的網關驗證問題,但我可以下載文件。有沒有辦法抑制這個錯誤或只是將它降級爲警告?

Perl Code: 
my $ff = File::Fetch->new(uri => "$uri"); 
my $where = $ff->fetch (to => "$DOWNLOAD_LOCATION"); 
print Dumper($ff); 

Output:  
Fetch failed! HTTP response: 502 Bad Gateway [502 notresolvable] at   
<path>\myfile.pl line 249. 

Dumper Output: 
$VAR1 = bless({'vol' => '', 
       'file_default' => 'file_default', 
       '_error_msg' => 'Fetch failed! HTTP response: 502 Bad Gateway [502 notresolvable]', 
       'file' => 'myfilename.zip', 
       'scheme' => 'http', 
       'path' => '/repository/download/buildlabel/1042086:id/', 
       '_error_msg_long' => 'Fetch failed! HTTP response: 502 Bad Gateway [502 notresolvable] at C:/Perl/lib/File/Fetch.pm line 598. 
+0

那麼腳本不會退出?那麼你會發出警告?你可以通過本地化'$ SIG {__ WARN __}'來控制它。 – zdim

回答

0

看來問題是打印到STDERR的警告(消息)。顯然你沒有得到die或程序將退出。您可以通過設置$SIG{__WARN__}掛鉤來控制打印郵件的過程,該掛鉤最好在塊中進行本地化。

my $where; 

FETCH: { 

    local $SIG{__WARN__} = sub { 
     print "WARN: @_";  # or whatever appropriate 
    }; 

    $where = $ff->fetch (to => "$DOWNLOAD_LOCATION");  
}; 

my $where = do { 
    local $SIG{__WARN__} = sub { print "WARN: @_" }; 
    $ff->fetch; 
}; 

信號的處置–打印到STDERR –是塊,這是什麼local提供的外部恢復。見this in perlsub,特別是在「綱要」之後的文本。您也可以通過在完成後說$SIG{__WARN__} = 'DEFAULT';來手動完成。

參見warn

如果有安裝了$SIG{__WARN__}處理程序被打印任何消息。處理者有責任處理它認爲合適的信息(例如,將其轉換爲死亡信息)。

另見時的警告消息將要被打印的%SIG條目in perlvar

通過$SIG{__WARN__}表示的程序被調用。警告消息作爲第一個參數傳遞。 __WARN__掛鉤的存在會導致普通打印STDERR的警告被抑制。


雖然決定要調用一個「錯誤」,什麼是「警告」可能有點武斷,似乎清楚地表明你的程序只發出一條消息,STDERR和繼續。那麼上面的就足夠了。

如果您被die擊中,那麼您可以將代碼包裝在eval中。

+0

@duskwuff感謝您的編輯。我從文檔複製,並沒有注意到(ciritical)部分是未格式化的。謝謝! – zdim

相關問題