Как можно исключить catch на PHP при ошибке unserialize генерировать ошибку?
Как поймать исключение исключения?
Ответ 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