unserialize()
エラーが発生したときにPHPで例外をキャッチすることは可能ですか?
質問する
14374 次
5 に答える
17
いいえ、キャッチできませんunserialize()
。例外はスローしません。
渡された文字列がアンシリアライズできない場合、FALSE が返され、E_NOTICE が発行されます。
カスタム例外ハンドラーを設定して、すべてのエラーを処理できます。
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");
于 2012-10-02T05:15:05.590 に答える
17
簡単な方法は次のとおりです。
$ret = @unserialize($foo);
if($ret === null){
//Error case
}
しかし、これは最新のソリューションではありません。
最善の方法は、前に述べたように、カスタム エラー/例外ハンドラーを用意することです (この場合だけではありません)。しかし、あなたが何をしているかによっては、やり過ぎかもしれません。
于 2012-10-02T07:05:04.227 に答える
5
完全なソリューションは次のようになります。
<?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
于 2016-08-27T05:42:03.327 に答える
5
すべての PHP エラー (警告通知など) を例外に変換します。例はこちらです。
于 2012-10-02T05:45:43.377 に答える