Почему следующее не печатает "Ошибка!" но печатает только предупреждение «не удалось открыть поток...»?
try {
file_get_contents('www.invalid-url.com');
} catch (Exception $e) {
echo 'Error!';
}
Почему следующее не печатает "Ошибка!" но печатает только предупреждение «не удалось открыть поток...»?
try {
file_get_contents('www.invalid-url.com');
} catch (Exception $e) {
echo 'Error!';
}
file_get_contents не генерирует исключение, но возвращает FALSE, если это терпит неудачу. file_get_contents — очень примитивная функция. Если вам нужна более подробная обратная связь, используйте cURL.
Например. что-то вроде этого:
$curl = curl_init('your URL here');
// Return the output to a string instead of the screen with CURLOPT_RETURNTRANSFER
curl_setopt($pCurl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($pCurl, CURLOPT_TIMEOUT, 10);
$content = curl_exec($curl);
$info = curl_getinfo($curl);
if($info['http_code'] === 200)
{
return $content;
}
Он возвращает FALSE при ошибке, он не генерирует исключение.
Таким образом, вы можете использовать @, чтобы подавить предупреждение (если требуется) и проверить результат, чтобы увидеть, была ли ошибка.
$content = @file_get_contents('http://www.example.com');
if ( $content === FALSE ){
echo "Error!";
}
PHP по умолчанию использует не исключения, а механизм сообщений об ошибках. Если вам нужны исключения, вы можете использовать собственный обработчик ошибок, как в http://php.net/manual/en/class.errorexception.php
Более PHP-подобный способ - отключить сообщение об ошибке и проверить код возврата. Завершение работы может быть выполнено глобально с помощью error_reporting(0);
или ini_set('display_errors', false);
или с помощью оператора @
.
<?php
if (!@file_get_contents(....)) {
echo "ERROR";
}
?>
@
в отдельном операторе здесь и там иногда может быть самым простым решением — даже в этом случае имейте в виду, что даже подавленные ошибки неэффективны: обработчик ошибок вызывается всегда, даже когда ошибка подавляется. С другой стороны, подавление ошибок во всем, что приводит к выполнению более одной строки PHP (например, include
или вызов определяемой пользователем функции), определенно является хорошим способом превратить отладку в ад.
- person Frank Farmer; 25.11.2009