【问题标题】:How to see errors suppressed by '@'?如何查看被“@”抑制的错误?
【发布时间】:2015-06-01 19:47:49
【问题描述】:

我作为站点管理员加入了这家疯狂的公司。现在我对影响 PHP 脚本执行的数据库配置进行了一些更改。

奇怪的是 PHP 脚本就这样死掉了。他们不会抛出任何错误。当我进入脚本时,我意识到他们使用了@错误抑制指令。现在整个代码库有数百万行分布在数千个文件中,并且不想运行类似 sed 的东西来替换“@”。

但是 '@' 让我无法进行调试。就像开发人员闭上眼睛,发现黑暗在说它的夜晚。

有没有办法我可以撤消'@'完成的错误抑制并让 php log 指令处理它。接触代码库不是一种选择。我期待通过修改 php 配置或在引导文件中添加几行来实现此目的的方法。

【问题讨论】:

  • 搜索和替换有什么问题?肯定比修补 PHP 引擎容易。
  • 只需将 '@' 替换为 '' 也会在不用于抑制的地方替换它。说一个包含电子邮件 ID 或正则表达式代码的文件来验证。
  • 简而言之,不要在字符串和cmets中替换它。可以在.. 让我们高估.. 一个小时?
  • 你不能让 PHP 忽略错误抑制操作符。您必须删除它,然后有选择地用一袋门把手击败您的程序员,以便首先使用它。 find /path/to/approot -name '*.php' -exec grep -H '@' {} \; 然后玩得开心。
  • 您应该可以使用set_error_handler() 并通过if (0 === error_reporting()) { ... } 记录错误。有关示例,请参见手册页上 Elad Yosifon 的回答:php.net/manual/en/function.set-error-handler.php

标签: php error-handling


【解决方案1】:

如果您安装并启用了Xdebug(在开发中,您应该这样做),那么您可以设置xdebug.scream 配置选项,它会禁用@-operator。

另外,scream PECL extension 也禁用 @-operator(仅此而已)。

基本上你安装扩展然后将scream.enabled ini设置设置为true/on。

【讨论】:

    【解决方案2】:

    对于通过set_error_handler 安装的处理程序,仍然可以看到静音错误。所以你可以在你的引导文件中添加这样的东西:

    set_error_handler(function ($errno, $errstr, $errfile, $errline) {
        echo "$errstr at $errfile($errline)\n";
    });
    

    或者,更好,

    set_error_handler(function ($errno, $errstr, $errfile, $errline) {
        throw new ErrorException($errstr, $errno, 1, $errfile, $errline);
    });
    

    这也将显示堆栈。

    【讨论】:

      猜你喜欢
      • 2011-11-26
      • 2013-02-18
      • 1970-01-01
      • 2017-03-02
      • 2023-03-19
      • 2012-03-24
      • 2012-10-29
      • 1970-01-01
      • 2018-01-21
      相关资源
      最近更新 更多