如果函数在PHP中抛出致命错误,如何在下一个循环中继续执行?

时间:2012-11-26 07:32:30

标签: php exception-handling error-handling web-scraping fatal-error

我会给你一个要点。

我正在尝试使用third party HTML tag stripper抓取某些网址,因为我认为默认的strip_tags()不能很好地完成工作。 (我认为你不需要检查刮刀)

现在有时,某些网站的HTML源代码包含一些奇怪的代码,导致我的HTML代码剥离器失败。

其中一个例子是this site,其中包含以下代码:

<li><a href="<//?=$cnf['website']?>girls/models-photo-gallery/?sType=6#top_menu">Photo Galleries</a></li>

导致上述标签剥离器抛出此错误:

  

解析错误:语法错误,意外   T_ENCAPSED_AND_WHITESPACE,期待T_STRING或T_VARIABLE或    / var / www / GET中的T_NUM_STRING   推文/ htdocs / tmhOAuth-master / examples / class.html2text.inc(429):   行 1 致命错误的正则表达式:   preg_replace()[&lt; a   HREF = 'function.preg替换' &GT; function.preg替换&LT; / A&GT]:   评估代码失败:   $这 - &安培; GT; _build_link_list(安培; QUOT;&安培; LT; // = $ CNF [\ '网站\']&安培;?GT;女孩/模型-光廊/ STYPE = 6#top_menu&安培?; QUOT ;,   &amp; quot;照片画廊&amp; quot;)在 / var / www / GET中   在线推文/ htdocs / tmhOAuth-master / examples / class.html2text.inc    429

现在发生的是,有一个包含许多URL的数组,有些会抛出上述错误。我对每个URL进行一些处理。

如果数组中的某个URL抛出这样的错误,我希望执行继续处理下一个URL而不会打扰任何东西。我的代码是这样的:

foreach ($results as $result)
{
    $url=$result->Url;

    $worddict2=myfunc($url,$worddict2,$history,$n_gram);        
}

这里myfunc处理并使用我之前提到的第三方HTML剥离器。 我尝试将代码修改为:

foreach ($results as $result)
    {
        $url=$result->Url;
        $worddicttemp=array();
        try
        {
            $worddicttemp=myfunc($url,$worddict2,$history,$n_gram); //returns the string represenation of what matters, hopefully
            //The below line will be executed only when the above function doesn't throw a fatal error
            $worddict2=$worddicttemp;
        }
        catch(Exception $e)
        {
            continue;
        }
    }

但我仍然遇到同样的错误。 怎么了?为什么myfunc()中的代码现在会在遇到致命错误时立即将控制转移到catch块?

2 个答案:

答案 0 :(得分:0)

我建议你在解析之前使用像Tidy这样的美化脚本。您的问题可以通过添加

来解决
$html_content = htmlspecialchars($html_content)

答案 1 :(得分:-1)

你无法捕获解析错误(或任何致命错误,但解析错误甚至更糟,因为它们会在加载代码后立即生成)。我知道隔离它们的最好方法是为你要恢复的任何东西运行完全独立的PHP进程,并期望生成致命错误。

另见How do I catch a PHP Fatal Error