如何抑制来自 Perl 模块的错误消息?

问题描述 投票:0回答:2

当使用 Fetch 从 Teamcity 下载 url 时,我收到 Fetch failed!错误。但文件的下载确实有效。

他们最近更改了我们的 Teamcity 服务器的权限,因此我在获取要下载的文件的 URL 时必须使用用户名和密码。我只是想知道这是否会导致网关的 fetch 验证出现问题,但我可以下载该文件。有没有办法抑制此错误或将其降级为警告?

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.
perl
2个回答
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,特别是“Synopsis”之后的文本。您也可以在完成后说
$SIG{__WARN__} = 'DEFAULT';
来手动执行此操作。

参见警告

如果安装了

$SIG{__WARN__}
处理程序,则不会打印任何消息。处理程序有责任按其认为合适的方式处理消息(例如,将其转换为骰子)。

另请参阅 perlvar 中的

%SIG
条目

当即将打印警告消息时,将调用

$SIG{__WARN__}
指示的例程。警告消息作为第一个参数传递。
__WARN__
钩子的存在会导致对 STDERR 的普通警告打印被抑制。


虽然决定什么称为“错误”以及什么称为“警告”可能有点武断,但很明显,您的程序仅向

STDERR
发出一条消息并继续。那么以上就足够了。

如果您被

die
击中,那么您可以将代码包装在 eval 中。


并不是真正的信号处理程序,而是一个内部“钩子”。请参阅文档和下面的文字。


0
投票

正如文档所解释的,只需设置

$File::Fetch::WARN = 0;

抑制警告。

© www.soinside.com 2019 - 2024. All rights reserved.