Ошибка пропуска в выражении eval {} - PullRequest
0 голосов
/ 14 июля 2011

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

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

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

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

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

Когда я использую eval{}, я думаю, что он пропускает ошибку и движется вперед, но я не уверен. Потому что это ошибка: Invalid content type in response:text/plain.

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

1 Ответ

3 голосов
/ 14 июля 2011

ОК, я думаю, что понимаю ваш вопрос, но немного больше кода помогло бы, как, например, указание, какой Perl API - не то, чтобы это казалось важным для ответа, но это большая часть вашего вопроса.Сказав это, проблема кажется очень простой.

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

В любом случае, когда Perl нажимает eval{}, весь из eval{} завершается, и $& устанавливается на ошибку.Таким образом, наличие eval{} вне цикла означает, что ошибки покинут цикл.Если вы поместите eval{} внутри цикла, то при возникновении ошибки eval{} завершится, но вы перейдете к следующей итерации.Это так просто.

Я также обнаруживаю признаки того, что, возможно, вы не используете use strict; и use warnings;.Пожалуйста, сделайте это, так как они помогут вам быстрее найти много ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...