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