我有一个脚本可以删除一些旧的HTML。它每天大约有1000页,并且每隔一段时间它就会因某种原因而窒息,并引发以下错误:
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)时生成了错误,但是我将它包装在try {}语句中并且它没有捕获任何内容:
更新:
通过使用@查看脚本何时终止且没有错误,我找到了令人讨厌的代码行。这就是这条线:
try {
$items = $html->find('.searchResultHeader')->find('.vehTitle'); //this one
} catch (Exception $e) {
var_dump(get_class($e));
echo 'big dump'.$e->getTraceAsString();
}
当它轰炸时,它甚至不会回应“大转储”,所以它似乎并没有抓住它。
我想知道这可能是QueryPath错误处理的错误而不是我自己的错误吗?
答案 0 :(得分:0)
此:
$html->find('.searchResultHeader')->find('.vehTitle');
与此相同:
$html->find('.searchResultHeader .vehTitle');
但没有调用null-> find();
的风险如果您真的想分两步完成,请使用if
,而不是try
:
if($el = $html->find('.searchResultHeader')) $items = $el->find('.vehTitle');
或者也许是三元:
$items = ($el = $html->find('.searchResultHeader')) ? $el->find('.vehTitle') : null;
答案 1 :(得分:0)
它没有捕获,因为标准的try catch块不会捕获此类错误。为了捕获'Catchable'致命错误,需要E_RECOVERABLE_ERROR Set Error Handler。
另请参阅:How can I catch a “catchable fatal error” on PHP type hinting?。