unserializeエラーを生成すると、PHPで例外を捕捉する方法はありますか?例外をシリアル化解除する方法は?
12
A
答えて
8
いいえ、キャッチすることはできません。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");
3
は例外にすべてのPHPエラー(警告の通知など)を変換します。例はhereです。
$ret = @unserialize($foo);
if($ret === null){
//Error case
}
しかし、それは最も近代的なソリューションではありません。
9
簡単な方法があります。
上記のように、カスタムエラー/例外ハンドラ(この場合のみならず)を使用するのが最善の方法です。しかし、あなたがやっていることに応じて、それは過度のことかもしれません。
2
完全なソリューションには、次のようになります。ドキュメントあたり
<?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
関連する問題
- 1. 特定の型をシリアル化から除外する方法は?
- 2. .Net XMLのシリアル化の例外を処理する方法?
- 3. WCF CFClientBaseシリアル化Stackoverflow例外?
- 4. WCFシリアル化例外 - NetDataContractSerializer
- 5. DataContractSerializerシリアル化のスロー例外#
- 6. データベースセッションのシリアル化を解除するCodeigniter
- 7. 配列のシリアル化を解除する
- 8. Protobuf-Netを使用して.Net例外をシリアル化する方法は?
- 9. データベースデータをシリアル化/シリアル化解除しますか?
- 10. シリアル化の例外は声明
- 11. ddbgを使用して例外を解除する方法
- 12. 投稿されたデータのシリアル化を解除する方法は?
- 13. jsonpickleでシリアル化の特定のフィールドを除外する方法は?
- 14. GWT - RPCのシリアル化例外とMapDB
- 15. MongoDBオブジェクトのシリアル化、スタックオーバーフロー例外
- 16. jQuery - シリアル化された文字列のシリアル化を解除する
- 17. ランタイム中にJSON/XMLシリアル化からデータメンバーを除外する方法
- 18. PDOException:PDOインスタンスをシリアル化またはシリアル化解除できません
- 19. xCodeの関数のシリアル化解除
- 20. Rails 1.2.3データのシリアル化解除
- 21. Adaがレコードをシリアル化する方法を理解する
- 22. WCF jsonはバイト配列の例外を逆シリアル化します
- 23. グラフをシリアル化する方法は?
- 24. pysparkパイプラインオブジェクトをシリアル化する方法は?
- 25. NodeSeqをシリアル化する方法は?
- 26. FlexJSONは逆シリアル化時にプロパティを除外します
- 27. エラー:例外RangeError:私は、シリアル化中にこのエラーをエラー#2006
- 28. コードigniter php - 配列のシリアル化を解除する
- 29. フォームの値のシリアル化を解除する
- 30. シリアルを使用してboost :: ptr_vectorをシリアル化する方法は?
:渡された文字列はunserializeableでない場合は、FALSEが返されます。幸運にも、 'serialize(false)'を行う人は幸いです。 – gfaceless
"渡された文字列が直列化不能でない場合、FALSEが返され、** E_NOTICEが発行されます。**" E_もスローされます。 – zedee