2012-10-02 30 views

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

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

+0

"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

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