如何在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。
9
的簡單方法是:
$ret = @unserialize($foo);
if($ret === null){
//Error case
}
但它不是最先進的解決方案。
最好的方法是如前所述有一個自定義的錯誤/異常處理程序(不僅爲這種情況)。但取決於你在做什麼,這可能是矯枉過正。
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. GWT反序列化異常
- 2. JIL反序列化異常
- 3. 異常反序列化JSON
- 4. jackson:在反序列化列表時捕獲單個項的異常
- 5. 如何在異常中捕獲異常?
- 6. 用InnerExceptions反序列化一個異常
- 7. Json.net嘗試反序列化,從異常
- 8. InvalidOperationException異常對反序列化
- 9. 反序列化JSON來對象異常
- 10. 異常嘗試反序列化的XAML
- 11. C#JSON反序列化字典異常
- 12. Newtonsoft.JSON單浮動反序列化異常
- 13. Java8 LAMBDA反序列化ClassCastException異常
- 14. 部署後NServiceBus反序列化異常
- 15. InvalidOperationException異常反序列化的Atom XML
- 16. XML反序列化內部異常
- 17. 無法反序列化eof異常
- 18. 反序列化過程中的異常
- 19. Windows Phone 7反序列化異常
- 20. boost :: serialization反序列化xml_archive異常
- 21. PGpoint休眠(反)序列化異常
- 22. BinaryFormatter外存異常反序列化
- 23. 反序列化異常處理
- 24. 如何捕獲此異常
- 25. 如何捕獲Interop異常?
- 26. 如何捕獲substr異常?
- 27. 如何捕獲entitydatasource異常
- 28. 如何捕獲ReactiveCommand異常?
- 29. 如何捕獲jquery異常?
- 30. 如何捕獲CheckInvalidPathChars()異常
每文檔:如果傳遞的字符串不unserializeable,則返回FALSE。幸運的是,很少有人會''serialize(false)' – gfaceless
「如果傳遞的字符串不是非序列化的,則返回FALSE **併發出E_NOTICE **。 E_也被拋出。 – zedee