【问题标题】:Can i suppress error message from fetch.pm in Perl我可以在 Perl 中抑制来自 fetch.pm 的错误消息吗
【发布时间】:2017-07-01 07:46:57
【问题描述】:

使用 Fetch 从 Teamcity 下载网址时,我收到 Fetch 失败!错误。但是文件的下载确实有效。

他们最近更改了我们 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.

【问题讨论】:

  • 所以脚本没有退出?那么您正在收到警告吗?你可以通过本地化$SIG{__WARN__}来控制它。

标签: perl teamcity fetch


【解决方案1】:

问题似乎是一个警告(消息)被打印到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'; 手动执行此操作。

warn

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

另见%SIG条目in perlvar

$SIG{__WARN__} 指示的例程在即将打印警告消息时被调用。警告消息作为第一个参数传递。 __WARN__ 钩子的存在导致向 STDERR 的普通警告打印被禁止。


虽然决定什么叫“错误”和什么叫“警告”可能有点武断,但很明显您的程序只向STDERR 发出一条消息并继续。那么以上就足够了。

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

【讨论】:

  • @duskwuff 感谢您的编辑。我从文档中复制并从未注意到(关键)部分未格式化。谢谢!
【解决方案2】:

正如the documentation 解释的那样,只需设置

$File::Fetch::WARN = 0;

抑制警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多