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

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

// 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 находится в приведенном выше коде.

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

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

Обновить

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

 if(fopen(urlencode(trim("$next_url")), 'r')){ $html3 = file_get_html(urlencode(trim("$next_url"))); }else{ //do other stuff, error_logging return false; } 

Вот идея:

 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 является допустимым решением.Это может генерировать исключения, и вы можете использовать это для обработки ваших ошибок.Есть много причин, по которым file_get_contents могут генерировать предупреждения, а руководство по PHP рекомендует понижать error_reporting: См. Руководство

Используйте 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); ?> 

Из моего 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; } 

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

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