Подтвердить что ты не робот

Хорошая обработка ошибок с помощью file_get_contents

Я использую simplehtmldom, который имеет этот функционал:

// get html dom form file
function file_get_html() {
    $dom = new simple_html_dom;
    $args = func_get_args();
    $dom->load(call_user_func_array('file_get_contents', $args), true);
    return $dom;
}

Я использую его так:

$html3 = file_get_html(urlencode(trim("$link")));

Иногда URL-адрес может быть недействительным, и я хочу обработать это. Я думал, что могу использовать try и catch, но это не сработало, поскольку оно не генерирует исключение, оно просто дает php-предупреждение:

[06-Aug-2010 19:59:42] PHP Warning:  file_get_contents(http://new.mysite.com/ghs 1/) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found  in /home/example/public_html/other/simple_html_dom.php on line 39

Строка 39 находится в приведенном выше коде.

Как я могу правильно обработать эту ошибку, могу ли я просто использовать обычное условие if, это не похоже, что он возвращает логическое значение.

Спасибо всем за помощь

Update

Это хорошее решение?

if(fopen(urlencode(trim("$next_url")), 'r')){

    $html3 = file_get_html(urlencode(trim("$next_url")));

}else{
    //do other stuff, error_logging
    return false;

}
4b9b3361

Ответ 1

Вот идея:

function fget_contents() {
    $args = func_get_args();
    // the @ can be removed if you lower error_reporting level
    $contents = @call_user_func_array('file_get_contents', $args);

    if ($contents === false) {
        throw new Exception('Failed to open ' . $file);
    } else {
        return $contents;
    }
}

В основном оболочка file_get_contents. Он выдает исключение при неудаче. Чтобы избежать переопределения file_get_contents, вы можете

// change this
$dom->load(call_user_func_array('file_get_contents', $args), true); 
// to
$dom->load(call_user_func_array('fget_contents', $args), true); 

Теперь вы можете:

try {
    $html3 = file_get_html(trim("$link")); 
} catch (Exception $e) {
    // handle error here
}

Подавление ошибок (либо с помощью @, либо путем снижения уровня error_reporting является допустимым решением.Это может генерировать исключения, и вы можете использовать это для обработки ваших ошибок.Есть много причин, t21 > может генерировать предупреждения, а сам справочник по PHP рекомендует понижать error_reporting: См. руководство

Ответ 2

Используйте CURL, чтобы получить URL-адрес и обработать ответ об ошибке таким образом.

Простой пример из curl_init():

<?php
// create a new cURL resource
$ch = curl_init();

// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);

// grab URL and pass it to the browser
curl_exec($ch);

// close cURL resource, and free up system resources
curl_close($ch);
?>

Ответ 3

Из моего POV хорошая обработка ошибок - одна из больших проблем в PHP. К счастью, вы можете зарегистрировать свой собственный обработчик ошибок и сами решить, что делать.

Вы можете определить довольно простой обработчик ошибок следующим образом:

function throwExceptionOnError(int $errorCode , string $errorMessage) {
    // Usually you would check if the error code is serious
    // enough (like E_WARNING or E_ERROR) to throw an exception
    throw new Exception($errorMessage);
}

и зарегистрируйте его в своей функции следующим образом:

function file_get_html() {
    $dom = new simple_html_dom;
    $args = func_get_args();
    set_error_handler("throwExceptionOnError");
    $dom->load(call_user_func_array('file_get_contents', $args), true);
    restore_error_handler();
    return $dom;
}

Ответ 4

ЕСЛИ youre извлекает из внешнего URL-адреса, лучшая обработка будет поступать из него, используя библиотеку HTTP, такую ​​как Zend_Http. Это не сильно отличается от использования CURL или fopen, за исключением того, что он собирается извлечь данные этих "dirvers" в универсальный API, а затем вы можете выбрать, который вы хотите использовать. Его также будет иметь встроенный захват ошибок, чтобы облегчить вам работу.

Если вы не хотите накладных расходов на другую библиотеку, вы можете сами ее кодировать - в этом случае я всегда предпочитаю CURL.