【问题标题】:Why can't I catch this 'Maximum Nested Function' Exception in PHP?为什么我不能在 PHP 中捕捉到这个“最大嵌套函数”异常?
【发布时间】:2014-12-06 18:17:25
【问题描述】:

由于我的代码中的递归函数,我遇到了异常,由于我正在编码的性质,可以忽略异常并返回 FALSE。所以这里有一些简化的代码来说明我的问题。

function recursive() {
  try{ recursive(); }
  catch(Exception $e)
  { echo "Error Caught!"; }
}
recursive();

我似乎无法捕捉到“已达到 '100' 的最大函数嵌套级别,正在中止!”例外。 我是否误解了 try-catch 的工作原理?

【问题讨论】:

  • exception吗?我以为是error,然后是fatal error;所以除非你有一个可以将fata错误转换为异常的错误处理程序,否则它无法被捕获
  • 我不是 PHP 专家,所以我不知道这是否适用。但也许优化器将递归变成了循环,因为如果不考虑异常,递归就是尾递归,因此可以进行最后调用优化,从而将其变成循环。
  • 是的,我认为 Mark 有,我不知道不能像这样捕获错误。
  • 错误和异常有很大不同;虽然可以捕获异常,但不能捕获错误......可以使用自定义 error handler 将一些错误转换为异常,但 PHP 不能以任何方式捕获致命错误,因为它们是致命的
  • 是的,我实际上无法从错误中恢复。有趣的是,我更容易修复导致异常的原因而不是捕获它。

标签: php function exception nested try-catch


【解决方案1】:

因为它是致命错误而不是异常,所以你不能使用 try & catch。

一个错误通常意味着程序的执行无论如何都不能继续,必须中止。

另一方面,异常类似于警告,表示出现问题,但如果正确处理此异常,程序可以继续执行。

try & catch 的示例可能是: 尝试连接到数据库...函数 connect 抛出异常,因为无法访问数据库服务器...您捕获异常并做出决定,然后让我们从缓存文件中读取内容。异常背后的意图是,让开发人员决定是否要捕获异常并继续执行程序或暂停它。

【讨论】:

    【解决方案2】:

    “PHP 致命错误:已达到 '100' 的最大函数嵌套级别,正在中止!”

    这是一个“致命错误”,而不是例外。 PHP 中无法使用 set_error_handler 将其转换为 Exception(这对于将较低级别的错误转换为异常很有用)。

    如果出现“致命错误”,您唯一能做的就是使用 register_shutdown_function 进行一些清理,您可以在其中调用 error_get_last 并识别发生了这个特定的致命错误。但这就是你所能做的,没有办法继续设计的程序流程。

    顺便说一句,仅当您在 php.ini 中启用了 XDebug 模块时,才会发生此部分致命错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-08
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      相关资源
      最近更新 更多