Не удалось поймать исключение

Почему следующее не печатает "Ошибка!" но печатает только предупреждение «не удалось открыть поток...»?

try {
    file_get_contents('www.invalid-url.com');
} catch (Exception $e) {
    echo 'Error!';
}

person breez    schedule 25.11.2009    source источник


Ответы (3)


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;
}
person TheGrandWazoo    schedule 25.11.2009

Он возвращает FALSE при ошибке, он не генерирует исключение.

Таким образом, вы можете использовать @, чтобы подавить предупреждение (если требуется) и проверить результат, чтобы увидеть, была ли ошибка.

$content = @file_get_contents('http://www.example.com');
if ( $content === FALSE ){
    echo "Error!";
}
person Yacoby    schedule 25.11.2009

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";
}
?>
person johannes    schedule 25.11.2009
comment
Подавление сообщений об ошибках еще никому не помогало. Это не тот путь. Если вы дойдете до того, что вам придется отлаживать этот код, вы ударите себя по голове, когда поймете, что выбрасываете достоверную отладочную информацию. - person TheGrandWazoo; 25.11.2009
comment
Глобальное подавление ошибок — очень плохая идея, но подавление ошибок с помощью @ в отдельном операторе здесь и там иногда может быть самым простым решением — даже в этом случае имейте в виду, что даже подавленные ошибки неэффективны: обработчик ошибок вызывается всегда, даже когда ошибка подавляется. С другой стороны, подавление ошибок во всем, что приводит к выполнению более одной строки PHP (например, include или вызов определяемой пользователем функции), определенно является хорошим способом превратить отладку в ад. - person Frank Farmer; 25.11.2009
comment
так что лучшей идеей было бы оставить отчеты об ошибках при разработке, чтобы включить их глобально, когда код будет готов к производству? - person breez; 26.11.2009
comment
Фрэнк, я считаю, что лучше всего отключить display_Errors в производственной системе и регистрировать все ошибки. @ очень усложняет отладку... - person johannes; 26.11.2009