【问题标题】:Error handling in perl apiperl api 中的错误处理
【发布时间】:2011-07-15 18:25:00
【问题描述】:

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

最初的问题是,如果 URI 没有可用数据,它就会死掉,我希望它跳过那个特定的 URI 并转到下一个可用的 URI。我用next unless ....; 来解决这个问题。

现在的问题是我试图通过调用 API 中的特定方法(称为 identifiers())从 Web 中提取特定数据。现在数据可用于 URI,但我正在寻找的特定数据(标识符)不可用并且它死了。

我尝试像这样使用 eval{}

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

当我使用 eval{} 时,我认为它会跳过错误并继续前进,但我不确定。因为它给出的错误是“Invalid content type in response:text/plain”。

虽然我手动检查了 URI,但它没有标识符,但它具有其余数据。我希望它跳过并移至下一个 URI。我该怎么做?

我收到了一位专家的回复: 当 Perl 遇到错误时,就像大多数语言一样,它会依次遍历调用上下文,直到找到可以处理错误的地方。 Perl 最基本的错误处理是 eval{} (但如果可以的话,我会使用 Try::Tiny,因为这样更清楚你正在处理错误而不是 eval 可以做的其他一些奇怪的事情)。 无论如何,当 Perl 命中 eval{} 时,整个 eval{} 退出,并且 $& 被设置为错误。因此,将 eval{} 置于循环之外意味着错误将离开循环。如果将 eval{} 放入循环中,当发生错误时,eval{} 将退出,但您将继续进行下一次迭代。就这么简单。

但实际上我得到的错误是响应中的内容类型无效:mycode 第 41 行的 text/html 和我的代码(我的程序)中的第 41 行实际上是来自网络的数据。我知道代码中没有错误,因为它适用于以前的 uri。现在,我该如何解决这个错误并继续下一个 uri?我的程序卡在这个错误上。

【问题讨论】:

  • 注意基于stackoverflow.com/questions/6693259/… 下的其他讨论:这不是直接使用 LWP::UserAgent,而是仅接受 XML 内容类型的 Connotea Perl API。上面的错误来自 Connotea Perl,而不是 LWP::UserAgent
  • @morungos。感谢您的回复,我很抱歉重复这个问题两次,我已经熟悉了 stackoverflow。好吧,我正在玩我的代码来获取标签。我在我的代码行周围使用了 eval 来获取标签。在整个代码中使用 eval 意味着什么?你能详细说明一下吗?谢谢萨米德
  • 建议编辑问题中的代码以显示更多上下文,目前我们无能为力
  • @morungos。好吧,我没有得到你。你的意思是贴代码。这是我正在使用的代码的 sn-p 以及它卡在while (<IN0>) { my $currentURI = $_; chomp($currentURI); my @tags = $c->posts_for(uri =>"$currentURI"); 的位置,我的@tags 行出现错误。

标签: perl api data-mining


【解决方案1】:

我现在假设您的代码如下所示:

while (<IN0>) {
    my $currentURI = $_; 
    chomp($currentURI); 
    my @tags = $c->posts_for(uri =>"$currentURI");
    ... do something ...
}

要安全地处理错误,请使用以下内容(假设为 eval()):

while (<IN0>) {
    my $currentURI = $_; 
    chomp($currentURI); 
    my @tags = eval {        # Use eval to make this safe, $@ will contain any error
        $c->posts_for(uri =>"$currentURI");
    }
    my $error = $@;
    if (defined($error)) {
        warn($error);        # If eval failed, warn and skip to next line
        next;
    }
    if (! @tags) {
        next;                # Assuming no tags means go to next line in input
    }
    ... do something ...
}

eval 在这里真正做的是保证可以处理的 Perl 错误以正常方式离开 eval 块,尽管如果发生这种情况,@tags 将是空的,$@ 将包含错误.如果设置了$@,其余逻辑会发出警告(并跳过输入行)。如果没有标签,您可能还是想跳过该行。

【讨论】:

  • 非常感谢。它奏效了,我非常感谢您的帮助和宝贵的时间。这也帮助我学习了错误处理。十分感谢。你是我的救星。谢谢你。 :)
  • 看来必须在eval{}的第二个花括号后面加分号;根据 perldoc.perl.org/functions/eval.html - 正确吗?
猜你喜欢
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2018-07-02
  • 1970-01-01
相关资源
最近更新 更多