如何强制 PHP 不抑制错误信息。

3

我正在使用一款大型的第三方php软件,它存在许多错误需要我去修复。但是这个过程非常困难,因为它使用了很多错误抑制符号@,例如@include 'brokenfile.php';,这会导致php停止运行而没有显示任何错误信息。所以我看到的只是一个空白页面,无法获得任何信息。我该如何强制php显示错误信息,即使它们被“抑制”了呢?


1
只需启用scream扩展并使用ini_set('scream.enabled', true)。 - Valery Viktorovsky
4个回答

5
有一个名为 scream 的扩展,可以禁用调试中的 @ 操作符。
手册中提到:

scream 扩展提供了禁用错误控制运算符以便报告所有错误的可能性。此功能由 ini 设置控制。

安装该扩展并在您的 php.ini 中启用它即可:
scream.enabled = On    

备选方案:

最近的 xdebug 版本也提供了此功能。您需要安装并设置 xdebug。

xdebug.scream = On

在php.ini中


尖叫声可能很完美,但对我不起作用。phpinfo显示已启用,但“@”仍然会阻止错误。 - Benubird
你需要先安装这个扩展。手册中包含了如何进行安装的信息。 - hek2mgl
看起来是时候更新xdebug并移除scream了。感谢分享。 - Valery Viktorovsky

1

使用小型shell命令可以递归地从代码中删除所有的"@":

find . -type f | xargs perl -pi -e 's/^@|(\s)@/$1/g'

或者您可以为每个更新的文件创建备份:
find . -type f | xargs perl -pi.bkp -e 's/^@|(\s)@/$1/g'

你会如何再次应用它们?虽然建议使用 Perl 解决方案很有趣,但它会在代码中造成严重的损害。 - hek2mgl
@hek2mgl 是的,但只有在没有使用版本控制系统(如git、svn等)的情况下才会出现这种情况——您可以在修复问题之前还原文件。 - Benubird
2
如果您不使用版本控制系统,可以创建备份文件:perl -e "s/FIND/REPLACE/g;" -pi.bkp $(find path/app -type f) - Valery Viktorovsky
1
@Benubird 是的,首先要做的是将代码添加到代码库中。 - Valery Viktorovsky

0

快速而不太规范的解决方案:您可以在整个项目中进行查找和替换,只需删除所有在其前面有空格的 @ 符号即可。在 Netbeans 中,您可以使用 Ctrl+H 来实现这一点。您要搜索的模式应该是 " @"(空格和 at 字符)。


0
使用这个:
<?php

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

set_error_handler("exception_error_handler");

function catchException($e)
{
    if (error_reporting() === 0)
    {
        return;
    }

    // Do some stuff
}

set_exception_handler('catchException');

?>

如果您使用 set_error_handler() 设置了自定义错误处理函数,则该函数仍将被调用,但是这个自定义错误处理程序可以(并且应该)调用 error_reporting(),当触发错误的调用之前带有 @ 时,它将返回 0。

参考:错误控制运算符


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接