Perl HTML Tree Builder, как обрабатывать ошибки

Задача довольно проста: получить доступ к URL-адресу и проанализировать его в зависимости от результата. В случае ошибки (404, 500 и т. Д.), Примите соответствующие меры. Последний кусок - тот, с которым у меня проблема.
Я перечислил оба фрагмента кода, которые я сейчас использую. Более длинный (LWP+TreeBuilder) работает для обоих условий; более короткое (TreeBuilder) работает для первого условия, но не работает для условия ошибки. Если я использую TreeBuilder и сайт возвращает ошибку 404 или другую ошибку, скрипт просто завершается! Есть идеи?

Более длинный код, который работает

использовать LWP::Simple;
использовать LWP::UserAgent;
использовать HTML::TreeBuilder;

$url="http://some_url.com/blahblah";
$response = LWP::UserAgent->new->request( HTTP::Request->new( GET => $url));
    if ($response->is_success) {

    $p = HTML::TreeBuilder->new();
    $ Р-> синтаксического анализа ($ response-> содержание);

    } еще {

    warn "Не удалось получить $url: ", $response->status_line, "\n";

    }

Короче тот, который не

использовать HTML::TreeBuilder;

$url="http://some_url.com/blahblah";

$tree = HTML::TreeBuilder->new_from_url($url);

2 ответа

Решение

Цитировать документы:

Если LWP не может получить URL-адрес или ответ не является HTML (как определено content_is_html в HTTP:: Заголовки), затем new_from_url умирает, и объект HTTP::Response находится в $HTML::TreeBuilder::lwp_response,

Попробуй это:

use strict;
use warnings;
use HTML::TreeBuilder 5; # need new_from_url
use Try::Tiny;

my $url="http://some_url.com/blahblah" ;
my $p = try { HTML::TreeBuilder->new_from_url($url) };
unless ($p) {
    my $response = $HTML::TreeBuilder::lwp_response;
    if ($response->is_success) {
        warn "Content of $url is not HTML, it's " . $response->content_type . "\n";
    } else {
        warn "Couldn't get $url: ", $response->status_line, "\n";
    }
}

скрипт просто выходит

Нет, это исключение. Вы всегда можете поймать исключение с eval BLOCK если ты так желал.

my $tree = eval { HTML::TreeBuilder->new_from_url($url) }
   or warn($@);
Другие вопросы по тегам