¿Cómo se puede detectar una excepción en PHP al deserializar generar error?Cómo atrapar la excepción de deserialización?
12
A
Respuesta
8
No, no puede verlo, unserialize()
no tira Excepción.
En caso de que la cadena pasada no sea deserializable, se devuelve FALSE y se emite E_NOTICE.
se puede establecer un manejador de excepción personalizada para manejar todos los errores:
function exception_error_handler($errno, $errstr, $errfile, $errline) {
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");
3
convertir todos los errores de PHP (advertencias avisos, etc.) a excepciones. El ejemplo es here.
9
Una forma sencilla es:
$ret = @unserialize($foo);
if($ret === null){
//Error case
}
Pero no es la solución más moderna.
La mejor manera es como se mencionó anteriormente para tener un controlador personalizado de error/excepción (no solo para este caso). Pero dependiendo de lo que estés haciendo puede ser excesivo.
2
Una solución completa se vería como la siguiente:
<?php
// As mentioned in the top answer, we need to set up
// some general error handling
function exception_error_handler($errno, $errstr, $errfile, $errline) {
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");
// Note, there are two types of way it could fail,
// the fail2 fail is when try to unserialise just
// false, it should fail. Also note, what you
// do when something fails is up to your app.
// So replace var_dump("fail...") with your
// own app logic for error handling
function unserializeSensible($value) {
$caught = false;
try {
$unserialised = unserialize($value);
} catch(ErrorException $e) {
var_dump("fail");
$caught = true;
}
// PHP doesn't have a try .. else block like Python
if(!$caught) {
if($unserialised === false && $value !== serialize(false)) {
var_dump("fail2");
} else {
var_dump("pass");
return $unserialised;
}
}
}
unserializeSensible('b:0;'); // Should pass
unserializeSensible('b:1;'); // Should pass
unserializeSensible('a:2:{s:1:"a";b:0;s:1:"b";s:3:"foo";}'); // Should pass
unserializeSensible('a:2:{s:1:"a";b:0;s:1:"b";s:3:1111111111111111;}'); // Should fail
unserializeSensible(123); // Should fail
unserializeSensible("Gday"); // Should fail
unserializeSensible(false); // Should fail2
unserializeSensible(true); // Should fail
Cuestiones relacionadas
- 1. Cómo atrapar la excepción UrlFetchApp.fetch
- 2. iOS + Cómo atrapar la excepción no controlada
- 3. Cómo atrapar una excepción de CloseHandle()
- 4. Python: ¿Cómo atrapar este tipo de excepción?
- 5. Choque después de atrapar la excepción
- 6. ¿Cómo atrapar la excepción en la lista de inicialización?
- 7. Nodejs: ¿Cómo atrapar una excepción del middleware?
- 8. ¿Cómo atrapar una excepción específica en JDBC?
- 9. ¿Cómo atrapar un error/excepción en R?
- 10. Cómo atrapar la excepción ConfigurationErrorsException por violar maxRequestLength?
- 11. de lanzar y atrapar la excepción de la función
- 12. Excepción con deserialización de marco XML simple
- 13. ¿Cómo atrapar cualquier excepción de Javascript en Clojurescript?
- 14. ¿Cuál es la mejor manera de atrapar una excepción IllegalArgumentException
- 15. ¿Cómo atrapar una excepción en el hilo principal si la excepción ocurre en el hilo secundario?
- 16. ¿Cómo atrapar cualquier excepción (System.Exception) sin una advertencia en F #?
- 17. Cómo atrapar la descompresión de IOError?
- 18. ¿Por qué atrapar una excepción solo para tirarla de nuevo?
- 19. Boost serialización/deserialización archivo "error de corriente" excepción
- 20. ¿Cómo atrapar una excepción no analizada de la función de lectura en Haskell?
- 21. Cómo atrapar la excepción Control-C en una aplicación de consola de Visual C++?
- 22. cómo atrapar un int
- 23. Cómo atrapar la excepción de C++ no administrada en C++ administrado
- 24. ¿Deberíamos atrapar siempre una Excepción, envolverla y pasarla?
- 25. ¿Por qué no puedo atrapar una excepción genérica en C#?
- 26. Llamada al servicio web WCF: ¿qué excepción (s) atrapar?
- 27. Cómo invocar la deserialización predeterminada con gson
- 28. Cómo atrapar el jQuery.event.trigger()?
- 29. ¿La mejor manera de atrapar una excepción de WCF en Silverlight?
- 30. cómo detectar la excepción de la vista MVC?
por documentación: En caso de que la cadena pasada no es revertir la seriación, se devuelve FALSO. Afortunadamente pocos lo harían 'serialize (falso)' – gfaceless
"En caso de que la cadena pasada no sea unserializable, se devuelve FALSE ** y se emite E_NOTICE **." También se lanza un E_. – zedee