2013-07-07 39 views
0

编辑:重写从零开始,旧的问题没有用php在递归中抛出异常超过执行时间

我在递归中抛出一个异常后发生错误。 这个异常不会被任何地方发现,它应该弹出并显示uncaught exception error,它不会。相反,它会产生time limit hit种错误。如果我将var_dumps放入代码中,它看起来像抛出了异常,但它会在超过限制后冻结并失败。

这是递归函数的一部分:

if($this->prvky[$iA]->ini < 1 || $this->prvky[$iB]->ini < 1){ 
    echo '--- THROWING ---'; 
    throw new \OutOfBoundsException('ini is smaller than 1'); 
} 

它运行在测试中非常精细,异常可能抛出,如果它是,它成功地将失败的uncaught exception

在没有发生异常情况下,在现实世界中运行良好。

但是,当条件在现实世界的通行证,并抛出异常,--- THROWING ---被印刷,这之后应uncaught exception,而是它旋转关闭疯狂失败了一段时间后,产生time limit exceeded错误。我知道肯定会抛出异常,并且我确信我不会在任何地方捕捉异常。

+0

你能增加更多的代码吗?不容易理解递归中发生了什么。 – flogvit

回答

3

真正的问题是out of memory错误,很可惜没有显示出,xdebug中的疯狂设置和产生大量数据的对象连通性的组合。

的内存不足的发生是因为除了不停地传递给函数的所有值的轨道,这要归功于这个疯狂的设置:

xdebug.var_display_max_depth = -1 
xdebug.var_display_max_children = -1 
xdebug.var_display_max_data = -1 

,我把我的XDebug很久以前被遗忘。 因此,那些具有对其他对象等的引用的对象,整个结构(大量长配置)在每次调用中被重复存储在堆栈中。我虽然这应该只能通过xdebug来处理,但似乎一旦抛出异常,xdebug会将此信息添加到异常的堆栈副本,从而消耗大量内存。 (可能,只是我的解释)

但它打印out of time,而不是out of memory。根据日志,错误(在同一请求中致命错误2)一个接一个地发生,但只有第二个被打印。来自堆栈的数据非常长,因此超过了在内存限制被触发很久之后试图在日志中写入堆栈的时间,产生了第二个错误,而不是第一个错误。