|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2011-08-13 19:58 UTC] 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)
Patchesskip-array-map-warning-on-exception.patch (last revision 2011-08-13 20:27 UTC by roan dot kattouw at gmail dot com)Pull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Oct 27 14:00:01 2025 UTC |
Basically what I'm doing is implode("\n", array_map('readStyleFile', $files) where $files is an array of file names, and readStyleFile() can throw an exception if something is wrong (in this case it's if the file doesn't exist, but other cases are imaginable). This exception then propagates up a few levels and is caught and handled. Throwing an exception from inside the map callback works just fine: it stops the callback, stops array_map(), propagates up to the caller of array_map(), then works its way up the call stack like any other exception. The only issue is that warning that won't go away.The same odd behaviour is in SQLite3 where the code below gives the output: PHP Warning: SQLite3::querySingle(): Unable to execute statement: in /test/src/exceptionTest1.php on line 11 Exception: test exception <?php function my_udf_md5($string) { throw new \Exception("test exception\n"); } $db = new SQLite3('mysqlitedb.db'); $db->createFunction('my_udf_md5', 'my_udf_md5'); try { $result = $db->querySingle('SELECT my_udf_md5("test")'); var_dump($result); } catch(\Exception $e) { echo "Exception: ".$e->getMessage(); }