Edit report at https://bugs.php.net/bug.php?id=61091&edit=1

 ID:                 61091
 User updated by:    chealer at gmail dot com
 Reported by:        chealer at gmail dot com
 Summary:            User-defined error handler run despite at sign (@)
                     error control operator
 Status:             Not a bug
 Type:               Bug
 Package:            *General Issues
 PHP Version:        5.3.10
 Block user comment: N
 Private report:     N

 New Comment:

Rasmus, the part you quoted is about error_reporting() settings, it merely 
mentions the error control operator.

My question was, could you quote where "http://www.php.net/set_error_handler 
[...] explains that the user-defined error 
handler should check the error_reporting level in order to comply with the '@' 
if so desired"?


Previous Comments:
------------------------------------------------------------------------
[2012-02-15 16:53:06] ras...@php.net

"error_reporting() settings will have no effect and your error handler will be 
called regardless - however you are still able to read the current value of 
error_reporting and act appropriately. Of particular note is that this value 
will 
be 0 if the statement that caused the error was prepended by the @ 
error-control 
operator."

------------------------------------------------------------------------
[2012-02-15 16:25:42] chealer at gmail dot com

Thanks rasmus, but I do not see this explanation. Could you quote it?

------------------------------------------------------------------------
[2012-02-15 03:45:12] ras...@php.net

This is very much by design and definitely won't be changed since that would 
break all sorts of code. It is also explicitly documented at 
http://www.php.net/set_error_handler which explains that the user-defined error 
handler should check the error_reporting level in order to comply with the '@' 
if 
so desired.

------------------------------------------------------------------------
[2012-02-15 03:06:15] chealer at gmail dot com

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 this bug report at https://bugs.php.net/bug.php?id=61091&edit=1

Reply via email to