Edit report at https://bugs.php.net/bug.php?id=55416&edit=1
ID: 55416
Comment by: roan dot kattouw at gmail dot com
Reported by: roan dot kattouw at gmail dot com
Summary: array_map() throws PHP warning if the callback
throws an exception
Status: Open
Type: Bug
Package: Arrays related
Operating System: Ubuntu Natty
PHP Version: 5.4.0alpha3
Block user comment: N
Private report: N
New Comment:
The attached patch fixes this by not throwing the warning if EG(exception) is
not NULL. IMO the warning should be removed completely (because it's
superfluous, and I don't see offhand how it can be triggered other than by an
exception, but I don't know PHP core at all), but it's easy to tweak my patch
into doing that instead; this patch is just the minimal solution.
Previous Comments:
------------------------------------------------------------------------
[2011-08-13 19:58:06] roan dot kattouw at gmail dot com
Description:
------------
If you map a function on an array using array_map(), and that function (the
callback) then throws an exception, you get a PHP Warning saying "An error
occurred while invoking the map callback". I guess this is sort of reasonable
if an actual error occurred (even though that error would presumably have
reported itself already, so it's superfluous), but an exception isn't an actual
error unless the code that catches the exception decides it is.
This is annoying me because I'm squashing PHP warnings and notices in my code,
but I can't get rid of this warning. I have a legitimate use case for throwing
an exception from my map function, so I can either rewrite my code to not use
an exception there (which would be extremely awkward) or write a foreach
equivalent of the array_map() call (which would just be ridiculous; PHP
provides array_map() for a reason: so you can write one-liners instead of
repetitive foreach loops), or remove the IMHO misplaced warning in PHP.
I'll dig into the PHP source and see if I can come up with a patch.
Test script:
---------------
error_reporting(E_ALL);
function barf($i) {
$foo = $bar['baz'];
throw new Exception('barf');
}
$a = array(1, 2, 3);
try {
array_map('barf', $a);
} catch(Exception $e) {
echo $e;
}
Expected result:
----------------
Notice: Undefined variable: bar in /home/catrope/php-5.4.0alpha3/testcase.php
on line 3
exception 'Exception' with message 'barf' in
/home/catrope/php-5.4.0alpha3/testcase.php:3
Stack trace:
#0 [internal function]: barf(1)
#1 /home/catrope/php-5.4.0alpha3/testcase.php(6): array_map('barf', Array)
Actual result:
--------------
Notice: Undefined variable: bar in /home/catrope/php-5.4.0alpha3/testcase.php
on line 3
Warning: array_map(): An error occurred while invoking the map callback in
/home/catrope/php-5.4.0alpha3/testcase.php on line 6
exception 'Exception' with message 'barf' in
/home/catrope/php-5.4.0alpha3/testcase.php:3
Stack trace:
#0 [internal function]: barf(1)
#1 /home/catrope/php-5.4.0alpha3/testcase.php(6): array_map('barf', Array)
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=55416&edit=1