From:             
Operating system: 
PHP version:      5.3.10
Package:          *General Issues
Bug Type:         Bug
Bug description:User-defined error handler run despite at sign (@) error 
control operator

Description:
------------
The at sign operator allows to "ignore" error messages, as explained in
http://ca3.php.net/manual/en/language.operators.errorcontrol.php

When prepended to an expression in PHP, any error messages that might be
generated by that expression will be ignored. 

However, user-defined error handlers registered with set_error_handler()
are nevertheless run when @ is used, which often causes such messages to
show, as in the below example, where a custom error handler is used to
customize the display of error messages.

As http://ca3.php.net/manual/en/language.operators.errorcontrol.php#98895
and http://ca3.php.net/manual/en/language.operators.errorcontrol.php#85042
show, this problem is not new. This behavior appears to be by design, and
might be wanted in some cases.

Therefore, please either:
Stop calling user-defined error handlers when suppressing errors. This
needs serious consideration for backwards-compatibility.
Allow specifying whether user-defined error handlers should be called when
suppressing errors.
Make the documentation reflect the current state of things.

Test script:
---------------
<?php

function myErrorHandler($errno, $errstr) {
    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;
    }
}

// function to test the error handling
function scale_by_log($vect, $scale)
{
    if (!is_numeric($scale) || $scale <= 0) {
        trigger_error("log(x) for x <= 0 is undefined, you used: scale =
$scale", E_USER_ERROR);
    }

    if (!is_array($vect)) {
        trigger_error("Incorrect input vector, array of values expected",
E_USER_WARNING);
        return null;
    }

    $temp = array();
    foreach($vect as $pos => $value) {
        if (!is_numeric($value)) {
            trigger_error("Value at position $pos is not a number, using 0
(zero)", E_USER_NOTICE);
            $value = 0;
        }
        $temp[$pos] = log($scale) * $value;
    }

    return $temp;
}

$a = array(2, 3, "foo", 5.5, 43.3, 21.11);


/* Value at position $pos is not a number, using 0 (zero) */
scale_by_log($a, M_PI);
@scale_by_log($a, M_PI);

set_error_handler("myErrorHandler");
@scale_by_log($a, M_PI);

?>


Expected result:
----------------
Notice: Value at position 2 is not a number, using 0 (zero) in
/var/www/atoperator.php on line 42

Call Stack:
    0.0005     339192   1. {main}() /var/www/atoperator.php:0
    0.0005     339836   2. scale_by_log(array (0 => 2, 1 => 3, 2 => 'foo',
3 => 5.5, 4 => 43.3, 5 => 21.11), 3.1415926535898)
/var/www/atoperator.php:55
    0.0006     340648   3. trigger_error('Value at position 2 is not a
number, using 0 (zero)', 1024) /var/www/atoperator.php:42

Actual result:
--------------
Notice: Value at position 2 is not a number, using 0 (zero) in
/var/www/atoperator.php on line 42

Call Stack:
    0.0005     339192   1. {main}() /var/www/atoperator.php:0
    0.0005     339836   2. scale_by_log(array (0 => 2, 1 => 3, 2 => 'foo',
3 => 5.5, 4 => 43.3, 5 => 21.11), 3.1415926535898)
/var/www/atoperator.php:55
    0.0006     340648   3. trigger_error('Value at position 2 is not a
number, using 0 (zero)', 1024) /var/www/atoperator.php:42

<b>My NOTICE</b> [1024] Value at position 2 is not a number, using 0
(zero)<br />
 


-- 
Edit bug report at https://bugs.php.net/bug.php?id=61091&edit=1
-- 
Try a snapshot (PHP 5.4):            
https://bugs.php.net/fix.php?id=61091&r=trysnapshot54
Try a snapshot (PHP 5.3):            
https://bugs.php.net/fix.php?id=61091&r=trysnapshot53
Try a snapshot (trunk):              
https://bugs.php.net/fix.php?id=61091&r=trysnapshottrunk
Fixed in SVN:                        
https://bugs.php.net/fix.php?id=61091&r=fixed
Fixed in SVN and need be documented: 
https://bugs.php.net/fix.php?id=61091&r=needdocs
Fixed in release:                    
https://bugs.php.net/fix.php?id=61091&r=alreadyfixed
Need backtrace:                      
https://bugs.php.net/fix.php?id=61091&r=needtrace
Need Reproduce Script:               
https://bugs.php.net/fix.php?id=61091&r=needscript
Try newer version:                   
https://bugs.php.net/fix.php?id=61091&r=oldversion
Not developer issue:                 
https://bugs.php.net/fix.php?id=61091&r=support
Expected behavior:                   
https://bugs.php.net/fix.php?id=61091&r=notwrong
Not enough info:                     
https://bugs.php.net/fix.php?id=61091&r=notenoughinfo
Submitted twice:                     
https://bugs.php.net/fix.php?id=61091&r=submittedtwice
register_globals:                    
https://bugs.php.net/fix.php?id=61091&r=globals
PHP 4 support discontinued:          
https://bugs.php.net/fix.php?id=61091&r=php4
Daylight Savings:                    https://bugs.php.net/fix.php?id=61091&r=dst
IIS Stability:                       
https://bugs.php.net/fix.php?id=61091&r=isapi
Install GNU Sed:                     
https://bugs.php.net/fix.php?id=61091&r=gnused
Floating point limitations:          
https://bugs.php.net/fix.php?id=61091&r=float
No Zend Extensions:                  
https://bugs.php.net/fix.php?id=61091&r=nozend
MySQL Configuration Error:           
https://bugs.php.net/fix.php?id=61091&r=mysqlcfg

Reply via email to