Перехватить фатальное исключение и продолжить.

Я знаю, что по самому своему определению фатальное исключение должно убить выполнение и не должно подавляться, но вот в чем проблема.

Я запускаю сценарий, который очищает, анализирует и сохраняет в БД около 10 000 страниц. Это занимает пару часов, а в редких случаях (1 из 1000) страница не проходит синтаксический анализ и выдает фатальное исключение.

В настоящее время я делаю следующее:

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;
    }
}

Приведенный выше код не работает для фатальных исключений .

Можно ли сделать что-то вроде этого: Если я переместил основной цикл в метод, а затем вызвал метод из 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 ...

Я ожидаю, что это сообщение выше, когда страница не может быть проанализирована с помощью метода, который я использую. Я не против просто пропустить эту страницу и перейти к следующей итерации цикла.

7
задан xbonez 12 January 2012 в 17:17
поделиться