2011-07-14 41 views
-3

我想从使用Perl API的网站提取数据。我正在使用URI列表从网站获取数据。eval {}声明中的跳过错误

最初的问题是,if there was no data available for the URI it would die,我希望它跳过那个特定的URI并转到下一个可用的URI。我用next unless ....;来解决这个问题。

现在的问题是我试图通过从API中调用特定方法(称为identifiers())从网络中提取特定数据。现在数据可用于URI,但具体数据(标识符),我正在查找的内容不可用,并且会死亡。

我试图用eval{}这样

eval { 
    for $bar ($foo->identifiers()){ 
     #do something 
    }; 
} 

当我使用eval{}我觉得它跳过错误并向前推进,但我不知道。因为它给出的错误是Invalid content type in response:text/plain

鉴于我手动检查了URI,虽然它没有标识符,但它包含了其余的数据。我希望这跳过并移动到下一个URI。我怎样才能做到这一点?

回答

3

好的,我想我理解你的问题,但多一点代码会有所帮助,就像指定哪个Perl API一样 - 不是它看起来对答案很重要,但它是你问题的重要组成部分。话虽如此,问题似乎很简单。

当Perl像大多数语言一样遇到错误时,它通过调用上下文运行,直到找到可以处理错误的位置。 Perl的最基本的错误处理是eval{}(但如果可以的话,我会使用Try::Tiny,因为它清楚地表明你正在做错误处理,而不是eval可以做的其他一些奇怪的事情)。

无论如何,当Perl命中eval{}时,整个eval{}退出,并且$&被设置为错误。因此,在循环外部使用eval{}意味着错误将会离开循环。如果您将eval{}置于的循环内,则当发生错误时,eval{}将退出,但您将继续进行下一次迭代。就这么简单。

我还检测到可能没有使用的标志use strict;use warnings;。请做,因为它们可以帮助您更快地发现许多错误。

+0

谢谢你的回答。那么,我正在使用的API是Connotea Perl API。我用严格的;并使用警告;感谢您的建议。此外,我得到的错误是无效的内容类型的响应:在mycode行41和我的代码(我的程序)41行的text/html是真正的来自web的数据。我知道代码中没有错误,因为它对于以前的uris来说工作正常。现在,我该如何解决这个错误,并继续前进到下一个uri?我的程序陷入了这个错误。 – sammed

+0

好的,Connotea Perl不是LWP :: UserAgent。它只接受RDF MIME类型,即application/xml或application/rdf + xml。 text/html也不是,那就是你的错误来自哪里。在这种情况下,服务器说内容不是RDF(因为它不是XML)。您可能需要围绕几乎所有Connotea Perl代码使用Try :: Tiny或eval来抵御此。 –