【问题标题】:How to cast exception object to stdClass?如何将异常对象转换为stdClass?
【发布时间】:2011-06-02 20:59:37
【问题描述】:

伙计们。我正在使用 ajax 通过 php 加载一堆数据。有时异常会未被发现。这会生成一些 javascript 无法解析的错误消息(因为它需要 json)。这会使页面崩溃,这并不酷。所以我正在构建一个自定义异常处理程序。基本上它应该只是 json_encode 异常对象。但 json 仅适用于 stdClass 类型的对象。所以这是实际的问题:

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

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

是的,我知道异常不应该从一开始就被捕获,但它更像是一种开发功能。它使调试不那么痛苦;-)

谢谢!

【问题讨论】:

  • 我认为正确的方法是捕获异常并使用它来构建您的返回对象。让 JSON 对其进行编码并将其传递回客户端。
  • json_encode 可以编码任何对象。它不适用于Exception,因为Exception 没有任何公共变量。但是您可以在异常处理程序中创建自己的类/数组并将其输出到浏览器。
  • 是的,你现在完全正确 ;-)

标签: php javascript ajax json exception


【解决方案1】:
  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()
    ));
    

【讨论】:

  • 谢谢,你几乎回答了我所有的问题。我不仅担心异常,还担心错误。这些事情不会像例外那样明显地发生。就像 mysql 查询失败,或者你除以零一样。
  • 使用PDO 进行数据库连接 - 它支持异常。使用自定义错误处理程序可能是一种解决方案,但是您的代码不应引发任何错误。
  • +1,但是 php 确实支持将异常强制转换为 stdClass:$x = new Exception("foo"); $x = (对象)(数组)$x;所以你可以序列化它,当然不是这样:)
【解决方案2】:

一种选择是设置一个自定义错误处理程序,并在您将它们回显到浏览器时使 shure 不发送 200 标头代码,这样您就可以以优雅的 js 方式处理错误。

其他选项是使用 ob_start ,或者一个大的尝试捕获......

【讨论】:

    【解决方案3】:

    好吧,这里有一个简单的函数可以帮您完成(将对象转换为关联数组,绕过访问限制):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-19
      • 2018-08-09
      • 2023-04-04
      • 2020-05-29
      • 2011-11-08
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多