如何将异常对象转换为stdClass?

时间:2011-01-03 14:09:02

标签: php javascript ajax json exception

Sup人。我正在使用ajax加载一堆数据与PHP。有时异常没有被捕获。这会生成一些javascript无法解析的错误消息(因为它期望json)。这会导致页面崩溃,这并不酷。所以我正在构建一个自定义异常处理程序。基本上它应该只是json_encode Exception对象。但是json只适用于stdClass类型的对象。所以这是实际的问题:

如何将异常对象转换为stdClass,以便我可以对其进行json_encode?我已经尝试过所有我能想到的天真的东西,比如

(stdClass) $ex(Object) ((Array) $ex)

是的,我知道开头的例外不应该是未被捕获的,但它更像是一个开发功能。它使调试不那么痛苦; - )

谢谢!

3 个答案:

答案 0 :(得分:3)

  1. PHP不支持对象转换。
  2. 在这种情况下使用异常处理程序是一个可怕的想法,尤其是当您需要做的只是:

    try {
        // Current code here, including other try-catch blocks
    } catch (Exception $e) {
        // handle uncaught exception
    }
    
  3. 发生错误时,您应该正确设置响应。将响应代码设置为500(内部服务器错误),以便JavaScript可以轻松处理。

  4. 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));