2011-09-16 50 views
1

我已经在一个Perl脚本下面的代码我写:Perl的try/catch块抛出错误Error.pm

#!/usr/bin/perl 
use DBI; 
use Getopt::Long; 
use Time::HiRes; 
use Error qw(:try); 

.... 

my $starttime = Time::HiRes::time; 

try { 
    my $dbh = DBI->connect("dbi:Sybase:$server", $username, $password); 
    $dbh->do("use $database"); 
    my $query="exec OfflineDatabaseReport"; 

    $row = $dbh->selectrow_hashref($query); 

    $dbh->disconnect(); 
} catch Error with { 
    print "boom"; 
    exit 1; 
}; 
my $endtime = Time::HiRes::time; 
my $timetaken = $endtime - $starttime; 

脚本工作得很好,直到我裹在try...catch数据访问部分块。现在我得到以下异常抛出:

不能使用字符串(“1316135985.90893”)作为HASH裁判而“严格裁判”在使用中/usr/lib/perl5/site_perl/5.8.8/Error .pm的线217

我也尝试设置:

no strict "refs"; 

但我仍然得到同样的错误。我是否在使用try/catch区块时很天真?

+2

从CPAN上该模块的描述:*使用“错误”模块不再推荐,因为其语法糖的黑魔法性质往往会破坏。它的维护者已经停止了积极编写使用它的代码,并阻止人们这样做。请参阅下面的“另请参阅”部分以获取更好的建议。* http://search.cpan.org/~shlomif/Error-0.17016/lib/Error.pm –

+0

@brian - 啊......这个建议彻底打击了我的盲点。随意facepalm。 – Kev

+0

我的意思是,我并不是说这里的某个人可能有一些建议是不可能的,但是我对调查问题的兴趣有点停止在那里:-D –

回答

3

这就是解析器如何看待代码:

try({ ... }, catch(Error, with({ ... }, my $endtime = Time::HiRes::time))); 

意义,它通过为with BLOCK子的第二个参数设置$endtimeTime::HiRes::time的结果。综观Error.pm源,我看到:

这意味着with BLOCK,SCALAR是一个有效的参数列表。它所做的只是将参数传递给catch,其将my $endtime = Time::HiRes::time解释为$clausescatch自己返回$clauses,果然整个语句转换成:

try({ ... }, my $endtime = Time::HiRes::time); 

try假定$clauses是hashref,你可以通过调用看到

$clauses->{'finally'}->() 
    if(defined($clauses->{'finally'})); 

所以perl的尝试使用的Time::HiRes::time值作为一个hashref,它肯定不能,因为它实际上是一个值为“1316135985.90893”的标量。

所以是的,catch块末尾的分号。