Подтвердить что ты не робот

Как поймать исключение исключения?

Как можно исключить catch на PHP при ошибке unserialize генерировать ошибку?

4b9b3361

Ответ 1

Простым способом является:

$ret = @unserialize($foo);
if($ret === null){
   //Error case
}

Но это не самое современное решение.

Лучший способ, как упоминалось ранее, иметь собственный обработчик ошибок/исключений (не только для этого случая). Но в зависимости от того, что вы делаете, это может быть излишним.

Ответ 2

Нет, вы не можете его поймать, unserialize() не выбрасывает исключение.

Если переданная строка не является несериализуемой, возвращается FALSE и выдается E_NOTICE.

вы можете настроить собственный обработчик Exception для обработки всех ошибок:

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

Ответ 3

Преобразование всех ошибок PHP (предупреждений и т.д.) в исключения. Пример здесь.

Ответ 4

Полное решение будет выглядеть следующим образом:

<?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