我有一个脚本,可以抓取一些旧的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的错误处理而不是我自己的错误?
发布于 2013-08-09 10:13:29
这一点:
$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;发布于 2013-11-11 22:17:22
它不能捕获,因为标准的try catch块不能捕获这种类型的错误。为了捕获“可捕获”的致命错误,需要E_RECOVERABLE_ERROR的Set Error Handler。
另请参阅:How can I catch a “catchable fatal error” on PHP type hinting?。
https://stackoverflow.com/questions/17953301
复制相似问题