使用错误异常处理程序和关闭序列在没有堆栈帧的情况下防止异常

2024-01-29

这一周我遇到了一些小问题。前面的错误消息是关于:

[2012 年 12 月 30 日 15:19:32] PHP 致命错误:在第 0 行的 Unknown 中没有堆栈帧的情况下抛出异常

我认为这是因为我的错误处理程序(详细信息见下文)正在将任何错误转换为异常。如果没有堆栈框架,我可能应该阻止这种情况。

有没有一种简单的方法可以找出PHP中是否有堆栈框架?

Details:

在我的一个网站上,我运行了一个错误处理程序,它将每个错误转换为异常,这是常见的ErrorException http://php.net/ErrorException准确地说。

我前一段时间引入了它,因为该网站主要是遗留代码,我希望任何问题都会导致异常,我最终可以以简化的方式“捕获”异常处理程序并停止请求。

我将其放入它自己的类中,注册处理程序,同时打开一个输出缓冲区以捕获输出,直到引发异常。基本上代码是这样的:

// register output buffering
$r = ob_start(array($this, 'handleBuffer'));

// register error handler       
$this->_originalErrorHandler = set_error_handler(array($this, 'handleError'));

// register exception handler
$this->_originalExceptionHandler = set_exception_handler(array($this, 'handleException'));

这一切都很好,直到我决定添加另一个输出缓冲类到混合中。只是一个捕获所有输出,然后可以在网站上进行一些“后期制作”,包括检查 HTML 问题(是的,这都是一些遗留问题,所以实际上这有点像鸭子胶带,我知道)。顺便说一句,这也非常有效。但是当我在新组件中犯了错误时却没有:

[2012 年 12 月 30 日 15:19:32] PHP 致命错误:在第 0 行的 Unknown 中没有堆栈帧的情况下抛出异常

这基本上是我的问题。有没有一种简单的方法可以防止出现这些错误?我有点知道为什么会出现这个错误,但我不太确定,所以我很难真正规避这个问题。我试图释放新的输出缓冲区before脚本进入新的关闭阶段,因为我认为这会导致这种情况。但这并没有成功。


您的问题表明您正在使用EOL (生命尽头) 版本的 PHP(特别是 PHP

这可能是由于几个不同的原因造成的。一些最常见的如下:

  1. 您从错误处理程序或异常处理程序内部引发了异常。
  2. 您从析构函数内部引发了异常。
  3. 您从回调内部引发了异常(如输出缓冲回调函数)。

这是一个示例,演示了您在某些情况下的问题......

function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}

function myExceptionHandler($exception) {
    echo "We got an exception with message: '{$exception->getMessage()}'";
}

function myCallBack($contents) {
    trigger_error('ohnoes!'); // You can't throw an error from the output buffer callback function in older versions of PHP < 5.3
}

class Foo {
    public function __destruct() {
        trigger_error('ohnoes!'); // You can't throw an error from a destructor in older versions of PHP < 5.3
    }
}

set_error_handler('myErrorHandler');
set_exception_handler('myExceptionHandler');

上面的代码会导致您看到您在此处描述的致命错误......

ob_start("myCallBack");

... 和这里...

$foo = new foo;

此问题已在 PHP >= 5.3.0 中得到修复,因此如果您使用的是最新版本的 PHP,则不应看到此问题。

最简单的修复方法是升级 PHP。如果这不是一个选择,您必须考虑这些事实,即您不能在 PHP 不希望抛出异常的地方抛出异常(在回调函数、错误处理程序、异常处理程序等中......实际上都被认为是PHP 回调)。

另一件事是你不应该以这种方式将每个错误都变成异常。如果您正在做的事情正如我提供的代码所示(即从错误处理程序内部抛出异常 - 从而将每个错误变成异常),那么您将导致自己a lot的痛苦,而且几乎没有任何好处。 PHP 错误不应该被处理。它们的目的是告知客户一个问题(客户端是编写 PHP 代码的人),或潜在的问题。处理错误本身并不像将每个错误都转换为异常然后处理该异常那么简单,因为并非每个错误都应该是异常的。例如,E_NOTICE 级别的错误在异常处理中没有地位。它们主要用于通知您可能存在错误,而不是您的代码一定存在错误,更不用说大多数错误甚至无法在用户空间代码中轻松处理(它们大多需要重新分解代码本身)。我强烈建议反对这种糟糕的做法.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用错误异常处理程序和关闭序列在没有堆栈帧的情况下防止异常 的相关文章

  • 我如何加入 Eloquent:关系?

    我的查询是这样的
  • 从路径中删除不必要的斜杠

    path home to my site 我正在尝试删除不必要的正斜杠 从上面的路径 我正在努力得到这个结果 home to my site 我失败了str replace 因为我不知道斜线的数量 优雅的解决方案 With preg rep
  • PHP mysql 选择连接

    我有这个功能 以某种形式显示自动建议 function searchbyId params input strtolower params input len strlen input limit isset params limit in
  • 如何将 PHP 数组中的值插入到 MySQL 表中?

    我正在创建一个注册表单 其中包含姓名 电子邮件和电话号码字段 为了检查用户输入的有效性 我有一个函数validate input 返回一个数组 arr包含用户输入的输入 如果用户输入有效 arr然后传递给一个单独的函数 该函数将值插入arr
  • Laravel 无法连接 Oracle

    我在用着耶吉拉 laravel oci8 https github com yajra laravel oci8用于 Oracle 与 Laravel 的连接 但我无法从客户端 PC 连接到 Oracle 服务器 showing this
  • php - 当存在 CDATA 时,将 xml 转换为 json 不起作用

    如果我使用以下php代码来转换xml to json I get Company fcsf Details n fgrtgrthtyfgvb n 但是 如果我使用CDATA in the Details元素如下
  • {PHP} 致命错误:不在对象上下文中时使用 $this (Joomla)

    我真的不了解 php 并且碰壁了 问题是我的网站显示以下错误 Fatal error Using this when not in object context in hermes web07 b2350 pow thefoodie htd
  • 更改订单项自定义元数据在 WooCommerce 管理订单中显示的标签和值

    在 Woocommerce 管理屏幕中 我尝试使用订单行元数据来显示一个按钮 该按钮将打开一个新窗口 其中包含代发货供应商的 URL 我已成功从订单产品中提取供应商 URL 并将其推送到订单行项目 我可以将元数据更改为按钮 但其结果是包含自
  • PHP:限制 foreach() 语句? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何限制 foreach 语句 假设我只希望它运行前 2 个 eaches 或其他什么 方法有很多 一种是使用计数器 i 0 foreac
  • 在 PHP / MySQL 中处理未读帖子

    对于个人项目 我需要使用 PHP 和 MySQL 构建一个论坛 我不可能使用已经构建的论坛包 例如phpBB 我目前正在研究构建此类应用程序所需的逻辑 但这已经是漫长的一天了 我正在努力解决为用户处理未读帖子的概念 我的一个解决方案是有一个
  • PHP/PDO 和 SQL Server 连接以及 i18n 问题

    在我们的网络应用程序中 我们使用 PHP5 2 6 PDO 连接到 SQL Server 2005 数据库并存储俄语文本 数据库排序规则是Cyrillic General CI AS 表排序规则是Cyrillic General CI AS
  • 回退到正则表达式中字符串的开头

    是否可以让正则表达式退回到字符串的开头并再次开始匹配 这就是我问的原因 给定下面的字符串 我想捕获子字符串black red blue and green按照该顺序 无论主题字符串中出现的顺序如何 并且仅当所有子字符串都存在于主题字符串中时
  • 使用 nuxtjs 登录 laravel sainttum 后出现 401(未经身份验证)错误

    我已经安装了 laravel v 7 30 4 nuxtjs v 2 15 7 当我使用 nuxtjs auth 模块登录我的 laravel sainttum 后 当 nuxt 尝试获取用户时 laravel 响应 401 错误 未经身份
  • 发送带有附件的 PHP HTML 邮件

    我遇到了一个问题 直到今天 我使用 PHP 发送 HTML 电子邮件 其中包含的标头 Content type text html 现在 我添加了添加附件的功能 为此 我必须将此行更改为 Content Type multipart mix
  • SimpleXML:使用包含命名空间的 XML

    我正在尝试从 google picasa API 获取地理信息 这是原始 XML
  • Laravel 5:如何检索并显示属于特定类别的所有帖子

    我有3张桌子 user id username subreddits id name created at posts id title link user id subreddit id 问题是 我手动获取 subreddit 类别的 i
  • 随机字体颜色

    我需要用 2 或 3 种随机颜色为文本着色 我如何在 PHP 或 JavaScript 中执行此操作 color str pad sprintf x x x rand 0 255 rand 0 255 rand 0 255 6 rand 0
  • 如何将 ZF2 单元/应用程序模块测试合并到单个调用中?

    我遵循将测试存储在模块中的 ZF2 约定 并且当从每个模块内运行测试时一切正常 我想做的是有一个根级别的 phpunit xml 来调用各个模块测试并将它们合并以生成代码覆盖率数据和其他指标 问题是每个单独的测试套件都是在模块化 phpun
  • PHP json_encode json_decode UTF-8

    如何将包含国际字符的 json 编码字符串保存到数据库 然后在浏览器中解析解码后的字符串
  • PHP - 将文件系统路径转换为 ​​URL

    我经常发现项目中的文件需要从文件系统和用户浏览器访问 一个例子是上传照片 我需要访问文件系统上的文件 以便可以使用 GD 来更改图像或移动它们 但我的用户还需要能够从类似以下的 URL 访问文件example com uploads myp

随机推荐