我知道,就其定义而言,致命的异常应该杀死执行,不应该将其抑制,但这就是问题所在。

我正在运行一个脚本,该脚本将大约10,000页的数据抓取,解析并存储在DB中。这需要几个小时,在极少数情况下(千分之一),页面解析失败并引发致命异常。

目前,我正在这样做:

for ($i=0;$i<$count;$i++)
        {
            $classObject = $classObjects[$i];

            echo $i . "   :   " . memory_get_usage(true) . "\n";

            $classDOM = $scraper->scrapeClassInfo($classObject,$termMap,$subjectMap);
            $class = $parser->parseClassInfo($classDOM);
            $dbmanager->storeClassInfo($class);

            unset($classDOM,$class,$classObject);
        }

我可以做类似的事情吗
for ($i=0;$i<$count;$i++)
{
   $classObject = $classObjects[$i];
   echo $i . "   :   " . memory_get_usage(true) . "\n";

   try
   {
      $classDOM = $scraper->scrapeClassInfo($classObject,$termMap,$subjectMap);
      $class = $parser->parseClassInfo($classDOM);
      $dbmanager->storeClassInfo($class);
      unset($classDOM,$class,$classObject);
    }
    catch (Exception $e)
    {
       //log the error here
       continue;
    }
}

上面的代码不适用于fatal exceptions

是否可以做这样的事情:
如果我将主循环移到方法中,然后从register_shutdown_function调用该方法?

像这样:
function do($start)
{
   for($i=$start;$i<$count;$i++)
   {
      //do stuff here
   }
}

register_shutdown_function('shutdown');

function shutdown()
{
   do();
}

这是执行停止时输出的消息:
Fatal error:  Call to a member function find() on a non-object in ...

当我使用的方法无法解析页面时,我期望以上消息。我可以跳过该页面并转到循环的下一个迭代,这很好。

最佳答案

致命错误是致命错误,会终止执行。如果发生致命错误,则无法解决此问题。但是,您的错误:



是完全可以预防的。只需添加检查以确保您具有正确对象的实例,否则,请处理错误:

if ($foo instanceof SomeObject) {
    $foo->find(...);
} else {
    // something went wrong
}

关于php - 捕获致命异常并继续,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8839173/

10-12 06:02