日期:2014-05-17  浏览次数:20369 次

set_error_handle 和 at(@)符号的问题
问题是这样的,我用set_error_handle 将一些系统错误或者警告信息写入到日志文件中。
但是对于一些api 比如fopen之类的,如果文件不存在的情况下也会跑到 自己写的错误处理函数中,之前是在fopen之前加上@符号,对诸如此类问题不进行显示。
如果我想在使用set_error_handle的情况下还能不把@的功能去掉。怎么做啊?
谢谢大侠们了


------解决方案--------------------
用try catch捕获
------解决方案--------------------
可以去掉,使用set_error_handler你只需要注意两点:
1.set_error_handler只会捕获error_reporting里定义的错误类型,这个可以在php.ini里配置,也可以使用函数设置;
2.自定义的错误处理函数返回值如果为false,则会触发php的默认错误处理。而返回值为true则不会触发php默认的错误处理,则看不到那个讨厌的报错了。

至于写法你可以参考一下。
<?php
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
if (!(error_reporting() & $errno)) {
//如果这个错误类型没有包含在error_reporting里
return;
}

switch ($errno) {
case E_USER_ERROR:
echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
echo " Fatal error on line $errline in file $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Aborting...<br />\n";
exit(1);
break;

case E_USER_WARNING:
echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
break;

case E_USER_NOTICE:
echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
break;
default:
echo "Unknown error type: [$errno] $errstr<br />\n";
break;
}
//返回false则会触发php的默认错误处理,反回true则只用自定义函数处理。
return true;
}
set_error_handler('myErrorHandler');
fopen('/tmp/foo', 'r');
------解决方案--------------------
经测试,#5的代码可以满足你的要求!
执行后,若
fopen('/tmp/foo', 'r');
失败,则显示
Unknown error type: [2] fopen(/tmp/foo) [function.fopen]: failed to open stream: No such file or directory


@fopen('/tmp/foo', 'r');
失败,则无任何显示