【发布时间】:2024-01-16 15:56:01
【问题描述】:
我知道,根据其定义,致命异常应该会终止执行,不应该被抑制,但问题就在这里。
我正在运行一个脚本,该脚本在数据库中抓取、解析和存储大约 10,000 个页面。这需要几个小时,并且在极少数情况下(千分之一)页面解析失败并引发致命异常。
目前,我正在这样做:
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 ...
当我使用的方法无法解析页面时,我希望看到上述消息。我可以跳过该页面并继续循环的下一次迭代。
【问题讨论】:
-
什么是
fatal exception?你的catch (Exception $e)怎么不工作了? -
确实.....有人扔了不延伸
Exception的东西吗? -
...在这种情况下,你不能只做
} catch ($e) {吗? -
我认为他的意思是
Fatal error。您收到的致命错误消息是什么?这将为您提供有关需要做什么的线索。可能一点也不例外。 -
@CharlesSprayberry:发布了得到输出的消息(见编辑)。我想我的措辞是错误的。它不是
fatal exception,而是fatal error。
标签: php exception exception-handling try-catch fatal-error