php – 抓住致命异常并继续

前端之家收集整理的这篇文章主要介绍了php – 抓住致命异常并继续前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我知道,根据它的定义,一个致命的异常应该杀死执行,不应该被压制,但这是问题所在.

我正在运行一个脚本,在数据库中擦除,解析和存储大约10,000页.这需要几个小时,在极少数情况下(1000个中有1个)页面无法解析并抛出致命异常.

目前,我这样做:

  1. for ($i=0;$i<$count;$i++)
  2. {
  3. $classObject = $classObjects[$i];
  4.  
  5. echo $i . " : " . memory_get_usage(true) . "\n";
  6.  
  7. $classDOM = $scraper->scrapeClassInfo($classObject,$termMap,$subjectMap);
  8. $class = $parser->parseClassInfo($classDOM);
  9. $dbmanager->storeClassInfo($class);
  10.  
  11. unset($classDOM,$class,$classObject);
  12. }

我能做点什么吗

  1. for ($i=0;$i<$count;$i++)
  2. {
  3. $classObject = $classObjects[$i];
  4. echo $i . " : " . memory_get_usage(true) . "\n";
  5.  
  6. try
  7. {
  8. $classDOM = $scraper->scrapeClassInfo($classObject,$subjectMap);
  9. $class = $parser->parseClassInfo($classDOM);
  10. $dbmanager->storeClassInfo($class);
  11. unset($classDOM,$classObject);
  12. }
  13. catch (Exception $e)
  14. {
  15. //log the error here
  16. continue;
  17. }
  18. }

上面的代码不适用于致命异常.

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

像这样:

  1. function do($start)
  2. {
  3. for($i=$start;$i<$count;$i++)
  4. {
  5. //do stuff here
  6. }
  7. }
  8.  
  9. register_shutdown_function('shutdown');
  10.  
  11. function shutdown()
  12. {
  13. do();
  14. }

这是执行停止时输出的消息:

  1. Fatal error: Call to a member function find() on a non-object in ...

当我正在使用的方法无法解析页面时,我希望上面的消息.我很好,只是跳过该页面并继续循环的下一次迭代.

致命错误是致命的并终止执行.如果发生致命错误,则无法解决此问题.但是,你的错误

Fatal error: Call to a member function find() on a non-object in …

是完全可以预防的.只需添加一个检查以确保您拥有正确对象的实例,如果没有,则处理错误

  1. if ($foo instanceof SomeObject) {
  2. $foo->find(...);
  3. } else {
  4. // something went wrong
  5. }

猜你在找的PHP相关文章