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

解决方案 »

  1.   

    可以去掉,使用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');
      

  2.   

    这样的话 也达不到需求啊。
    fopen的文件如果不存在 会是个warning的,如果你的error_reporting里面有设置warning的话 一样会输出错误,而没有用set_error_handler的话,在fopen前面加一个@符号就不会输出了,现在是不想放过waring但是对于像这种的warning又可以放过,到底怎么做呢?
      

  3.   

    经测试,#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');
    失败,则无任何显示
      

  4.   

    感谢 5楼 7楼 恍然大悟
    @会修改error_reporting的级别