21

unserialize()エラーが発生したときにPHPで例外をキャッチすることは可能ですか?

4

5 に答える 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 に答える