Обработка ошибок в Perl API - PullRequest
0 голосов
/ 15 июля 2011

Я пытаюсь извлечь данные с веб-сайта, используя Perl API. Я использую список URI для получения данных с веб-сайта.

Первоначально проблема заключалась в том, что если бы не было данных, доступных для URI, он умрет, и я хотел, чтобы он пропустил этот конкретный URI и перешел к следующему доступному URI. Я использовал next unless ....;, чтобы решить эту проблему.

Теперь проблема в том, что я пытаюсь извлечь конкретные данные из Интернета, вызывая определенный метод (называемый идентификаторами ()) из API. Теперь данные доступны для URI, но конкретные данные (идентификаторы), которые я ищу, недоступны, и они умирают.

Я пытался использовать eval {} вот так

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

Когда я использую eval {}, я думаю, что он пропускает ошибку и движется вперед, но я не уверен. Потому что это ошибка «Недопустимый тип содержимого в ответе: текст / обычный».

Принимая во внимание, что я проверил URI вручную, хотя у него нет идентификаторов, у него есть остальные данные. Я хочу, чтобы это пропустить и перейти к следующему URI. Как я могу это сделать?

Я получил ответ от одного из экспертов, который: Когда Perl обнаруживает ошибку, как и большинство языков, он проходит через контексты вызова по порядку, пока не найдет место, где он сможет обработать ошибку. Самая базовая обработка ошибок в Perl - это eval {} (но я бы использовал Try :: Tiny, если вы можете, так как теперь становится понятнее, что вы делаете обработку ошибок вместо некоторых других странных вещей, которые может сделать eval). В любом случае, когда Perl нажимает eval {}, весь eval {} завершается, и $ & устанавливается на ошибку. Таким образом, наличие eval {} вне цикла означает, что ошибки покинут цикл. Если вы поместите eval {} в цикл, при возникновении ошибки eval {} завершится, но вы перейдете к следующей итерации. Это так просто.

Но на самом деле ошибка, которую я получаю, - это недопустимый тип содержимого в ответе: text / html в строке 41 моего кода и строка 41 в моем коде (моей программе) действительно относится к данным из Интернета. Я знаю, что в коде нет ошибок, потому что он хорошо работает для предыдущих Uris. Теперь, как мне исправить эту ошибку и перейти к следующему URI? моя программа застревает на этой ошибке.

1 Ответ

5 голосов
/ 19 июля 2011

Теперь я предполагаю, что ваш код выглядит примерно так:

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 будет пустым, а $@ будет содержать ошибку , Оставшаяся логика предупреждает (и пропускает строку ввода), если была установлена ​​$@. Вы, вероятно, хотите пропустить строку в любом случае, если нет тегов.

...