set_error_handle和at(@)符号的有关问题
                        
                            时间:2021-07-01 10:21:17
                            帮助过:5人阅读
							                        
                     
                    
                    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默认的错误处理,则看不到那个讨厌的报错了。
至于写法你可以参考一下。
   function myErrorHandler($errno, $errstr, $errfile, $errline)
   {
       if (!(error_reporting() & $errno)) {
           //如果这个错误类型没有包含在error_reporting里
           return;
       }
       switch ($errno) {
           case E_USER_ERROR:
               echo "My ERROR [$errno] $errstr
\n";
               echo "  Fatal error on line $errline in file $errfile";
               echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")
\n";
               echo "Aborting...
\n";
               exit(1);
               break;
           case E_USER_WARNING:
               echo "My WARNING [$errno] $errstr
\n";
               break;
           case E_USER_NOTICE:
               echo "My NOTICE [$errno] $errstr
\n";
               break;
           default:
               echo "Unknown error type: [$errno] $errstr
\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');
失败,则无任何显示