PHP 中使用 @ 运算符抑制错误

2024-04-11

您认为,在您可能正在处理错误的情况下,使用 @ 运算符来抑制 PHP 中的错误/警告是否有效?

如果是这样,你会在什么情况下使用它?

欢迎使用代码示例。

编辑:回复者注意。我不想关闭错误报告,但是,例如,常见的做法是使用

@fopen($file);

然后检查...但是你可以通过这样做来摆脱@

if (file_exists($file))
{
    fopen($file);
}
else
{
    die('File not found');
}

或类似的。

我想问题是 - 是否有任何地方可以使用 @ 来抑制错误,而不能以任何其他方式处理?


注意:首先,我意识到 99% 的 PHP 开发人员都使用错误抑制运算符(我曾经是其中之一),所以我希望任何看到这一点的 PHP 开发人员都会不同意。

您认为,在您可能正在处理错误的情况下,使用 @ 运算符来抑制 PHP 中的错误/警告是否有效?

简短回答:
No!

更长更正确的答案:
我不知道,因为我不知道一切,但到目前为止,我还没有遇到过这是一个好的解决方案的情况。

为什么不好:
我认为在使用 PHP 大约 7 年的时间里,我已经看到了由错误抑制运算符引起的无休止的调试痛苦,并且从未遇到过不可避免的情况。

问题是,您正在抑制错误的代码片段当前可能只会导致您看到的错误;然而,当您更改被抑制行所依赖的代码或其运行环境时,该行很可能会尝试输出与您试图忽略的错误完全不同的错误。那么如何追踪未输出的错误呢?欢迎来到调试地狱!

我花了很多年才意识到,每隔几个月我就会因为压抑的错误而浪费多少时间。大多数情况下(但不限于)这是在安装了第三方脚本/应用程序/库之后,这些脚本/应用程序/库在开发人员环境中没有错误,但不是我的,因为 php 或服务器配置差异或缺少依赖项,通常会立即输出错误提醒问题出在哪里,但当开发人员添加魔法@时则不会提醒。

替代方案(取决于情况和期望的结果):
处理您意识到的实际错误,以便如果一段代码将导致某个错误,那么它就不会在该特定情况下运行。但我认为您明白了这一部分,您只是担心最终用户会看到错误,这就是我现在要解决的问题。

对于常规错误,您可以设置错误处理程序,以便在您查看页面时以您希望的方式输出它们,但对最终用户隐藏并记录下来,以便您知道用户触发了哪些错误。

对于致命错误设置display_errors在 php.ini 中关闭(您的错误处理程序仍然会被触发)并启用错误日志记录。如果您有开发服务器和实时服务器(我推荐),那么您的开发服务器上不需要执行此步骤,因此您仍然可以调试这些致命错误,而不必求助于查看错误日志文件。甚至还有一个使用关闭功能的技巧 http://www.php.net/manual/en/function.set-error-handler.php#88401向错误处理程序发送大量致命错误。

总之:
请避免它。这可能有一个很好的理由,但我还没有看到一个,所以直到那一天我都认为 (@) 错误抑制运算符是邪恶的。

你可以阅读我对错误控制操作符页面的评论 http://php.net/operators.errorcontrol#90987如果您想了解更多信息,请参阅 PHP 手册。

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

PHP 中使用 @ 运算符抑制错误 的相关文章

随机推荐

  • Apollo Android 客户端 - 无法访问类路径上生成的类

    我已经成功生成了 Apollo 类 并且可以在构建目录中看到它们 但是它们在类路径上不可用 奇怪的是 生成的枚举可用 但类本身不可用 运行 Apollo 的 Github 上提供的示例项目确实有效 但我看不到配置之间的差异 下面是麦克维 h
  • 在 PostgreSQL 中创建具有加密密码的用户

    是否可以在 PostgreSQL 中创建用户而不提供纯文本密码 理想情况下 我希望能够创建一个仅提供使用 sha 256 加密的密码的用户 我想做的是创建一个具有类似内容的用户 CREATE USER martin WITH PASSWOR
  • Android Material Design 示例代码给出缺少资源错误

    我正在尝试运行从下面相同的 Android 材料设计https github com material components material components android https github com material com
  • 我可以在 Rust 中将字符串转换为枚举而不使用宏吗?

    例如 如果我有如下代码 enum Foo Bar Baz Bat Quux impl Foo from input str gt Foo Foo input 这显然会失败 因为input不是 Foo 的方法 我可以手动输入 from inp
  • 如何处理错误并正确使用 Promise

    首先 我正在对我发布的这个问题进行跟进不久前 https stackoverflow com questions 53940043 unhandledpromiserejectionwarning this error originated
  • 如何从 VIM 运行 C 程序?

    有没有一种方法可以从 VIM 编译并运行 C 程序而无需输入文件名 gcc o somename somename使用时 将替换为当前打开的文件的名称 当你的项目变得更大时 你还可以编写一个makefile并编译当前项目 make 如果有任
  • 如何加载高分辨率图像Windows Phone任务代理? [内存不足]

    众所周知 Windows Phone 8 任务代理只能使用 11 5MB 内存 我试图在后台任务代理中制作动态锁屏图像 当我得到 480 800 图像时 它工作正常 但当我将其更改为 768 1280 时 出现异常 内存不足 1 像素投射
  • 如何循环遍历 Golang 结构体中的字段以可扩展的方式获取和设置值?

    我有一个结构体 Person type Person struct Firstname string Lastname string Years uint8 然后我有这个结构的两个实例 PersonA 和 Person PersonA Ob
  • 如何保存WPF UI状态?

    我有一个TabControl在它下面我有几个元素 例如TreeView and DataGrid 当我展开树并调整数据网格列的大小时 如果我然后切换到另一个选项卡并返回 整个 UI 状态都会被忘记 我必须重新展开树并调整列的大小 是否有一种
  • Android 没有按钮的对话框

    我可以创建一个没有否定或肯定按钮的对话框吗 特定行动后会自我毁灭吗 AlertDialog Builder dialog detect new AlertDialog Builder MainActivity this dialog set
  • 如何在 Swift 中将图像添加到 ARSCNScene 中?

    我在开发 Swift 游乐场时偶然发现了一个障碍 我想将图像添加到我的 ARSCNScene ARKit SceneKit 不是作为背景 而是作为具有位置和所有内容的实际节点 有谁知道这是否可能 我在网上找不到任何东西 谢谢 您可以轻松地将
  • 如何更改 vagrant 安装的 puppet 版本

    我在 Precision32 Base Box 上使用 vagrant 1 0 1 来玩木偶 配置工作正常 我的清单正在执行 默认情况下 vagrant 在 guest 虚拟机上的 opt vagrant ruby bin puppet 下
  • 使用 awk 在匹配后连接行

    我有一个如下所示的列表 gt aaa AAAAAAAAAA gt bbb BBBBBBBBBBBBBBBB gt ccc CCCCCCC 我想使用 awk 在 或 之后加入下一行 并使用逗号分隔符 这样它看起来像这样 gt aaa AAAA
  • C# Server.URLEncode 的 JavaScript 等价物是什么?

    C Server URLEncode 的 JavaScript 等价物是什么 encodeURI http xkr us articles javascript encode compare ref js msdn http xkr us
  • Maven 问题:项目构建错误:未解析的父 POM

    项目构建错误 无法解析 org springframework gs spring boot 0 1 0 的父 POM 无法从以下位置传输 org springframework boot spring boot starter paren
  • 在 Azure DevOps 中,是否有一种简单的方法可以将 wiki 从一个存储库复制到另一个存储库?

    我看到有一个 克隆维基 链接 但我不知道是否可以将克隆维基导入到另一个存储库中 我们正在做的是将我们的存储库从我们自己的 Azure 帐户移动到客户的 Azure 帐户 这样 wiki 将丢失 我不想手动复制所有 wiki 页面 是否可以将
  • 如何使用Sphinx管理多个版本的文档? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我维护一个用 C 编写的小型库项目 我想使用 Sphinx 来维护每个发行版本的图书馆网站 用户文档 我发现 类似的问题如何管理多个版本 htt
  • 无法在jsf页面中执行Javascript

    我是jsf新手 我一直在尝试用 commandbutton 做一个简单的 Javascript 函数 我尝试了很多次 但甚至无法发出警报消息 这是我的代码的一部分 请任何人指导我 并告诉我出了什么问题 以及我应该做什么才能让它运行
  • 如何在 UINavigationBar 中设置自定义字体?

    如何在 UINavigationBar 中设置自定义字体 我需要 tahoma 字体 void viewDidLoad self title My text 完全有可能 只是做起来有点棘手 一旦你找到了你需要的字体 iOS 已经附带的替代品
  • PHP 中使用 @ 运算符抑制错误

    您认为 在您可能正在处理错误的情况下 使用 运算符来抑制 PHP 中的错误 警告是否有效 如果是这样 你会在什么情况下使用它 欢迎使用代码示例 编辑 回复者注意 我不想关闭错误报告 但是 例如 常见的做法是使用 fopen file 然后检