如何在Archive :: Zip中静音警告

时间:2014-04-24 14:19:54

标签: perl

提取存档时,我不希望看到以下消息。

format error: file is too short at /usr/share/perl5/Archive/Zip/Archive.pm line 667.    
Archive::Zip::Archive::_findEndOfCentralDirectory('Archive::Zip::Archive=HASH(0x8acf47c)', 'IO::File=GLOB(0x8ac9d70)') called at /usr/share/perl5/Archive/Zip/Archive.pm line 581
Archive::Zip::Archive::readFromFileHandle('Archive::Zip::Archive=HASH(0x8acf47c)', 'IO::File=GLOB(0x8ac9d70)', 'some zip file') called at /usr/share/perl5/Archive/Zip/Archive.pm line 548

我想跳过一些损坏的档案。

3 个答案:

答案 0 :(得分:5)

乱用SIGWARN处理程序或将STDERR输出重定向到空设备是非常不整洁的。

Archive::Zip具有设置错误处理程序Archive::Zip::setErrorHandler的功能。默认设置是使用Carp::carp,它会生成您正在查看的输出。

您可以编写自己的替换,例如将错误消息保存在数组中供以后检查,如下所示

my @errors;
Archive::Zip::setErrorHandler(sub { push @errors, $_[0] });

另外,请不要忘记检查功能的返回代码,否则无法知道是否存在问题。

答案 1 :(得分:2)

根据您调用发出此错误的函数的位置,您可以在本地覆盖警告处理程序以忽略警告。

sub f {
   ...
   local $SIG{__WARN__} = sub { # do nothing };
} 

现在,函数f中发出的所有警告都会被路由到本地警告处理程序,后者不执行任何操作。

您应该注意,Archive :: Zip有一个从大多数操作返回的错误标志AZ_OK。例如:

# Read a Zip file
my $somezip = Archive::Zip->new();
if ( $somezip->read( 'someZip.zip' ) != AZ_OK ) {
    die 'read error';
}

答案 2 :(得分:-1)

`command-to-extract-file 2>/dev/null`

管道stderr到/ dev / null

这适用于linux。不确定窗口??