Last week I had the problem, that – due to a wrong database-entry – a serialized value got scrambled. And due to that (and some missconfiguration of the server) the application broke. Instead of a search result the user simply got an error message about not being able to unserialize the value due to an offset-error.
So how could I avoid the error (which actually is a notice) being thrown and besides that get to know whether unserializing worked or not?
The hack I finaly came up with is as follows:
- suppress the notice in any way
- check whether the returned value is a boolean false and the given string is ‘b:0;’ (which represents a boolean false in a serialized string).
- If so, the unserialize() failed, so lets throw an InvalidArgumentException
And here it is:
public function my_unserialize ( $value )
{
$unserialized = @unserialize ( $value );
if ( false === $unserialized && 'b:0;' !== $value ) {
$le = error_get_last ();
throw new InvalidArgumentException ( $le['message'] );
}
return $unserialized;
}
An alternative could be, to translate php errors into exceptions.
An Example for it could be found in the php manual http://www.php.net/manual/en/class.errorexception.php
Yes, that could be an alternative, when your environment allows translating all PHP-Errors into generic ErrorExceptions