2015-12-04 6 views
1

У меня есть такой код:PHP попытка поймать не работает должным образом

try { 
    $providerError = false; 
    $providerErrorMessage = null; 
    $nbg_xml_url = "http://www.somesite.com/rss.php"; 
    $xml_content = file_get_contents($nbg_xml_url); 
    // ... some code stuff 
} catch (Exception $e) { 
    $providerError = true; 
    $providerErrorMessage = $e -> getMessage(); 
    $usd = 1; 
    $rate = null; 
    $gel = null; 
} finally { 
    // .. Write in db 
}` 

и проблема заключается в том, что, когда file_get_contents не может читать URL (может быть сайт не отвечает или что-то вроде этого ..) мой код пишет ошибку : failed to open stream: HTTP request failed! и исполнение идет непосредственно, чтобы, наконец, заблокировать блок блокировки байпаса без ввода его.

любые идеи?

+0

Исключение, если оно выбрано, обрабатывается внутри вашего вызова метода и, следовательно, не передается вызывающему абоненту, то есть этот кодовый блок. – ryuu9187

ответ

2

Вы можете установить пустой обработчик ошибок, чтобы предотвратить предупреждение и после этого выбросить собственное исключение в случае сбоя. В этом случае я бы написать обычай file_get_content так:

function get_file_contents($url) { 

    $xml_content = file_get_contents($url); 

    if(!$xml_content) { 
     throw new Exception('file_get_contents failed'); 
    } 

    return $xml_content; 
} 

и будет использовать его в блоке:

set_error_handler(function() { /* ignore errors */ }); 

try { 
    $providerError = false; 
    $providerErrorMessage = null; 
    $nbg_xml_url = "http://www.somesite.com/rss.php"; 

    $xml_content = get_file_contents($nbg_xml_url); //<---------- 

    // ... some code stuff 
} catch (Exception $e) { 
    $providerError = true; 
    $providerErrorMessage = $e -> getMessage(); 
    $usd = 1; 
    $rate = null; 
    $gel = null; 
} finally { 
    // .. Write in db 
} 

Тогда не забудьте восстановить обработчик ошибок вызова:

restore_error_handler(); 

Обратите внимание, что при использовании собственного обработчика ошибок он будет обходить

error_reporting

установка и все ошибки, включая уведомления, предупреждения и т. Д., Будут переданы ему.

+0

отлично работает, спасибо – Arkadi

+0

Ваш прием, Если вы считаете, что мой ответ помог вам, пожалуйста, голосуйте или принимайте его. – wiredolphin

+0

Да, это действительно помогло, теперь мой парсер отлично работает – Arkadi

0
$xml_content = file_get_contents($nbg_xml_url); 

Функция file_get_contents не генерирует исключение. Таким образом, исключение не будет выбрано, если, как вы говорите, файл не найден.

Из документов:

An E_WARNING level error is generated if filename cannot be found...

Эта функция возвращает прочитанные данные или FALSE в случае возникновения ошибки. Таким образом, вы можете проверить, является ли $ xml_content FALSE ($ xml_content === false) и действовать соответственно.

Смежные вопросы