2013-07-30 1 views
1

У меня есть скрипт, который сбрасывает старый HTML-код. Это делает около 1000 страниц в день, и каждый так часто душит по какой-то причине и подбрасывает следующее сообщение об ошибке:Невозможно поймать «захватывающую фатальную ошибку» из QueryPath

PHP Catchable fatal error: Argument 1 passed to DOMXPath::__construct() must be an instance of DOMDocument, null given, called in /var/scraper/autotrader/inc/QueryPath/QueryPath/CSS/DOMTraverser.php on line 417 and defined in /var/scraper/autotrader/inc/QueryPath/QueryPath/CSS/DOMTraverser.php on line 467 

Сначала я подумал, что это ошибка генерируется, когда htmlqp ($ HTML) был вызван, но я завернул его в попытку {} заявление и оно не поймать что-нибудь:

UPDATE:

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

try { 
     $items = $html->find('.searchResultHeader')->find('.vehTitle'); //this one 
    } catch (Exception $e) { 
     var_dump(get_class($e)); 
     echo 'big dump'.$e->getTraceAsString(); 

    } 

Когда это бомбы, оно даже и не эхо «большой дамп», так что это на самом деле, кажется, не будет ловить его.

Мне интересно, может ли это быть причиной ошибки обработки ошибок QueryPath, а не моей?

+0

Может ли кто-нибудь дать представление о том, почему это не ловит? – James

+0

Я не знаю, нужен ли он кому-то еще, кому нужно решение, запрошенное на chekc http://stackoverflow.com/questions/2468487/how-can-i-catch-a-catchable-fatal-error-on- PHP-типа намекая –

ответ

0

Это:

$html->find('.searchResultHeader')->find('.vehTitle'); 

так же, как это:

$html->find('.searchResultHeader .vehTitle'); 

Но без риска вызова нуль-> найти();

Если вы действительно хотите сделать это в 2 этапа, используйте if, а не try:

if($el = $html->find('.searchResultHeader')) $items = $el->find('.vehTitle'); 

Или, может быть трехкомпонентной:

$items = ($el = $html->find('.searchResultHeader')) ? $el->find('.vehTitle') : null;