我知道,就其定义而言,致命的异常应该杀死执行,不应该将其抑制,但这就是问题所在。
我正在运行一个脚本,该脚本将大约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/