无法从QueryPath中捕获“可捕获的致命错误”

时间:2013-07-30 17:15:56

标签: php try-catch querypath

我有一个脚本可以删除一些旧的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错误处理的错误而不是我自己的错误吗?

2 个答案:

答案 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?