perl api中的错误处理

sma*_*ape 0 api perl data-mining

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

最初的问题是,如果没有可用于URI的数据,它将会死亡,我希望它跳过该特定的URI并转到下一个可用的URI.我曾经next unless ....;遇到过这个问题.

现在问题是我试图通过从API调用特定方法(称为标识符())来从Web提取特定数据.现在数据可用于URI,但是我正在寻找的特定数据(标识符)不可用而且它已经死亡.

我试着像这样使用eval {}

eval {
    for $bar ($foo->identifiers()){
        #do something
    };
}
Run Code Online (Sandbox Code Playgroud)

当我使用eval {}时,我认为它会跳过错误并向前移动,但我不确定.因为它给出的错误是"响应中的内容类型无效:text/plain".

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

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

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

Stu*_*att 5

我现在假设您的代码看起来像这样:

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

要安全地处理错误,请使用类似的东西(假设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 ...
}
Run Code Online (Sandbox Code Playgroud)

所有eval确实这里是保证能够被处理Perl的错误离开eval块以正常的方式,但如果出现这种情况,@tags将是空的,$@将包含错误.如果$@已设置,则剩余的逻辑警告(并跳过输入行).如果没有标签,你可能想要跳过这条线.