Sup人。我正在使用ajax加载一堆数据与PHP。有时异常没有被捕获。这会生成一些javascript无法解析的错误消息(因为它期望json)。这会导致页面崩溃,这并不酷。所以我正在构建一个自定义异常处理程序。基本上它应该只是json_encode Exception对象。但是json只适用于stdClass类型的对象。所以这是实际的问题:
如何将异常对象转换为stdClass,以便我可以对其进行json_encode?我已经尝试过所有我能想到的天真的东西,比如
(stdClass) $ex
和(Object) ((Array) $ex)
是的,我知道开头的例外不应该是未被捕获的,但它更像是一个开发功能。它使调试不那么痛苦; - )
谢谢!
答案 0 :(得分:3)
在这种情况下使用异常处理程序是一个可怕的想法,尤其是当您需要做的只是:
try {
// Current code here, including other try-catch blocks
} catch (Exception $e) {
// handle uncaught exception
}
发生错误时,您应该正确设置响应。将响应代码设置为500(内部服务器错误),以便JavaScript可以轻松处理。
Exception
对象仅提供可能有用的getMessage()
和getCode()
方法,因此可以生成响应正文:
$responseBody = json_encode(array(
'message' => $e->getMessage(),
'code' => $e->getCode()
));
答案 1 :(得分:0)
一个选项是设置一个自定义错误处理程序,并在你向浏览器回显它们时不要发送200个头代码,这样你就可以处理错误,这样你就可以优雅了。
其他选项可能是使用ob_start,或者是大尝试捕捉......
答案 2 :(得分:0)
嗯,这是一个简单的函数来为您完成(将对象转换为关联数组,绕过访问限制):
function obj2array($object) {
$r = new ReflectionObject($object);
$params = array();
foreach ($r->getProperties() as $prop) {
$prop->setAccessible(true);
$params[$prop->name] = $prop->getValue($object);
}
return $params;
}
然后编码:
$json = json_encode(obj2array($e));