Как привести объект исключения в stdClass? - PullRequest
2 голосов
/ 03 января 2011

SUP, ребята.Я использую AJAX для загрузки в кучу данных с помощью PHP.Иногда исключения остаются безнаказанными.Это генерирует некоторые сообщения об ошибках, которые javascript не может проанализировать (потому что он ожидает json).Это сбивает страницу, это не круто.Поэтому я создаю собственный обработчик исключений.По сути, это просто json_encode объекта Exception.Но json работает только с объектами типа stdClass.Итак, вот актуальный вопрос:

Как вы приводите объект исключения в stdClass, чтобы я мог json_encode его?Я перепробовал все наивные вещи, которые мог придумать, например

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

И да, я знаю, что исключения не должны быть непонятными для началаэто больше похоже на функцию разработки.Это делает отладку менее болезненной; -)

Спасибо!

Ответы [ 3 ]

3 голосов
/ 03 января 2011
  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()
    ));
    
0 голосов
/ 03 января 2011

Хорошо, вот простая функция, чтобы сделать это для вас (превратить объект в ассоциативный массив, минуя ограничения доступа):

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));
0 голосов
/ 03 января 2011

Один из вариантов - установить собственный обработчик ошибок и убедиться, что вы отправляете их в браузер, чтобы они не отправляли код 200 заголовков, чтобы вы могли справляться с ошибками, если вы просто элегантны.

Другими вариантами будет использование ob_start или большой попытки поймать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...