【问题标题】:Skipping error in eval{} statementeval{} 语句中的跳过错误
【发布时间】:2011-10-05 07:33:49
【问题描述】:

我正在尝试使用 Perl API 从网站中提取数据。我正在使用 URI 列表从网站获取数据。

最初的问题是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。我该怎么做?

【问题讨论】:

    标签: perl api


    【解决方案1】:

    好的,我想我理解您的问题,但是如果指定哪个 Perl API 会有所帮助 - 这似乎与答案无关,但它是您问题的重要组成部分。话虽如此,问题似乎很简单。

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

    无论如何,当 Perl 命中 eval{} 时,整个 eval{} 退出,并且 $& 被设置为错误。因此,将eval{} 置于循环之外意味着错误将离开循环。如果你把eval{}放在循环里面,当发生错误时,eval{}会退出,但你会继续下一次迭代。就是这么简单。

    我还检测到您可能没有使用use strict;use warnings; 的迹象。请这样做,因为它们可以帮助您更快地找到许多错误。

    【讨论】:

    • 感谢您的回答。好吧,我使用的 api 是 Connotea Perl API。我用过严格;并使用警告;谢谢你的建议。此外,我得到的错误是响应中的无效内容类型:mycode 第 41 行的 text/html 和我的代码(我的程序)中的第 41 行实际上是来自网络的数据。我知道代码中没有错误,因为它适用于以前的 uri。现在,我该如何解决这个错误并继续下一个 uri?我的程序卡在这个错误上。
    • 好的,Connotea Perl 不是 LWP::UserAgent。它只接受 RDF MIME 类型,即 application/xml 或 application/rdf+xml。 text/html 也不是,这就是您的错误的来源。在这种情况下,服务器说内容不是 RDF(因为它不是 XML)。您可能需要在几乎所有 Connotea Perl 代码中使用 Try::Tiny 或 eval 来防御这种情况。
    猜你喜欢
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多