首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从QueryPath捕获‘可捕获的致命错误’

无法从QueryPath捕获‘可捕获的致命错误’
EN

Stack Overflow用户
提问于 2013-07-31 01:15:56
回答 2查看 3.2K关注 0票数 1

我有一个脚本,可以抓取一些旧的HTML。它每天处理大约1000个页面,并且经常由于某些原因而阻塞,并抛出以下错误:

代码语言:javascript
复制
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{}语句中,它没有捕获到任何东西:

更新:

我已经找到了有问题的代码行,方法是使用@查看脚本何时终止而不会出现错误。就是这一行:

代码语言:javascript
复制
    try {
        $items = $html->find('.searchResultHeader')->find('.vehTitle'); //this one
    } catch (Exception $e) {
        var_dump(get_class($e));
        echo 'big dump'.$e->getTraceAsString();

    }

当它爆炸的时候,它甚至没有回响‘大转储’,所以它看起来真的没有捕捉到它。

我想知道这是不是QueryPath的错误处理而不是我自己的错误?

EN

回答 2

Stack Overflow用户

发布于 2013-08-09 10:13:29

这一点:

代码语言:javascript
复制
$html->find('.searchResultHeader')->find('.vehTitle');

与以下内容相同:

代码语言:javascript
复制
$html->find('.searchResultHeader .vehTitle');

但是没有调用null->find()的风险;

如果你真的想分两步完成,那就使用if,而不是try

代码语言:javascript
复制
if($el = $html->find('.searchResultHeader')) $items = $el->find('.vehTitle');

或者是一个三元组:

代码语言:javascript
复制
$items = ($el = $html->find('.searchResultHeader')) ? $el->find('.vehTitle') : null;
票数 0
EN

Stack Overflow用户

发布于 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?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17953301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档