Hi,

Apparently there is an implementation detail in JSON_THROW_ON_ERROR
that differs in the RFC text, from the discussion on list
http://news.php.net/php.internals/100569:

> I decided to reset it to no error because there's no
> previous error that needs handling by error-checking code, the exception
> takes care of that.

RFC text:

> When passed this flag, the error behaviour of these functions is changed.
> The global  error state is left untouched, and if an error occurs that would
> otherwise set it, these functions instead throw a JsonException with the
> message and code set to whatever json_last_error() and json_last_error_msg()
> would otherwise be respectively.

The implementation is highly surprising and can lead to bugs.

Imagine this code exists in a code base.

---------------------

$foo = json_decode('[bar');
// many lines of code.
// many lines of code.
// many lines of code.

$bar = json_encode('Hello world!');
if (json_last_error() !== JSON_ERROR_NONE) {
    throw new Exception("encoding went wrong!");
}

echo "All is fine";
// output is "All is fine"
---------------------


And to start moving to have json_encode throw on error, they start
using the flag on the json_encode

----------------------

$foo = json_decode('[bar');
// many lines of code.
// many lines of code.
// many lines of code.

$bar = json_encode('Hello world!', JSON_THROW_ON_ERROR);
if (json_last_error() !== JSON_ERROR_NONE) {
    throw new Exception("encoding went wrong!");
}

echo "All is fine";

-------------------

The result of this is that the user throw exception will be thrown
even though the encode worked correctly. https://3v4l.org/JJD5g

This is highly surprising*, and doesn't seem the right thing to be doing.

Does anyone have any objection to changing this, so that
json_last_error() + json_last_error_msg() always refer to the most
recent json_encode()/json_decode() function, as per the discussion. Or
does this need an RFC?

I've logged a bug for this regardless - https://bugs.php.net/bug.php?id=77997

cheers
Dan
Ack

* https://en.wikipedia.org/wiki/Principle_of_least_astonishment

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to