0

编辑:从头开始重写,旧问题没用

在递归中抛出异常后发生错误。异常不会在任何地方被捕获,它应该只是弹出并显示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错误。我确定会引发异常,并且我确定我不会在任何地方捕获异常。

4

1 回答 1

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 个致命错误)一个接一个地发生,但只打印了第二个。来自堆栈的数据真的很长,因此在尝试将堆栈写入日志时超过了时间,在达到内存限制很久之后,产生了第二个错误,而不是第一个错误。

于 2013-07-08T00:55:25.260 回答