【发布时间】:2013-09-20 09:13:09
【问题描述】:
我正在寻找如何禁用从包含文件报告的已知警告(以及与我的脚本无关的警告)的最佳解决方案。
包含文件的简短示例:
$ cat incl_file.php
<?php
error_reporting(E_ALL);
ini_set("display_errors", "on");
$x = $y;
?>
所需代码示例(不会阻止显示包含文件中的错误)
$ cat main2.php
<?php
error_reporting(E_ALL);
ini_set("display_errors", "on");
@include_once "incl_file.php";
$d=$e;
print "main_file\n";
?>
输出:
$ php main2.php
Notice: Undefined variable: y in /tmp/php_hack/incl_file.php on line 6
Notice: Undefined variable: e in /tmp/php_hack/main2.php on line 7
main_file
以下“解决方法”有效,但我对它的混乱不满意:
<?php
function myErrorHandler($errno, $errstr, $errfile, $errline) {
if (!(error_reporting() & $errno)) {
// This error code is not included in error_reporting
return;
}
//print "called $errstr\n";
/* Don't execute PHP internal error handler */
return true;
}
set_error_handler("myErrorHandler");
error_reporting(0);
ini_set("display_errors", "off");
include_once "incl_file.php";
restore_error_handler();
error_reporting(E_ALL);
ini_set("display_errors", "on");
$d=$e;
print "main_file\n";
?>
输出:
$ php main.php
Notice: Undefined variable: e in /tmp/php_hack/main.php on line 24
main_file
如果包含的文件没有
error_reporting(E_ALL);
ini_set("display_errors", "on");
那么@运算符按预期工作......
【问题讨论】:
-
错误很明显?只需在包含的文件中设置
$y(也可能设置$e?也就是说,不要使用@运算符来删除通知/警告。这是一个坏习惯,而且更难弄清楚在哪里发生错误。 -
@运算符只是意味着它不会因为实际的include而输出错误,例如找不到包含的文件等错误。它不会转包含所有代码的关闭错误。 -
我刚刚使用了 $x = $y;触发php错误。我可以改用 trigger_error()。
标签: php error-handling