2011-01-03 3 views
2

녀석들. 나는 ajax를 사용하여 많은 데이터를 PHP로로드하고있다. 예외가 잡히지 않는 경우가 있습니다. 이것은 javascript가 파싱 할 수없는 몇 가지 오류 메시지를 생성합니다 (json을 기대하기 때문에). 이것은 페이지를 충돌 시키며, 그것은 멋지지 않습니다. 그래서 사용자 정의 예외 처리기를 만들고 있습니다. 기본적으로 json_encode는 Exception 객체 여야합니다. 그러나 json은 stdClass 유형의 객체에서만 작동합니다. 그래서 여기에 실제 질문이 있습니다 :예외 개체를 stdClass로 캐스팅하는 방법은 무엇입니까?

예외 객체를 stdClass로 캐스팅하여 json_encode로 할 수 있습니까? 나는

(stdClass) $ex

(Object) ((Array) $ex)처럼 내가 생각할 수있는 모든 순진 물건을 시도했습니다 그리고 그래, 나는 예외로 시작하는 캐치되지 않을 것을 알고 있지만, 그것을 개발 기능과 같은 더. 디버깅을 덜 고통스럽게합니다 ;-)

고마워!

+1

적절한 방법은 예외를 잡아서 리턴 오브젝트를 빌드하는 것입니다. JSON으로 인코딩 한 다음 다시 클라이언트로 전달합니다. –

+1

'json_encode'는 모든 객체를 인코딩 할 수 있습니다. 'Exception'에는 public 변수가 없기 때문에'Exception'과 함께 작동하지 않습니다. 그러나 예외 처리기 내에 고유 한 클래스/배열을 만들어 브라우저에 출력 할 수 있습니다. –

+0

그래, 내 생각에 완전히 바르게 생각한다 ;-) – marcusklaas

답변

3
  1. PHP는 객체 캐스팅을 지원하지 않습니다 ...위한 ob_start, 또는 큰 시도 캐치를 사용하는 것입니다. 이 경우
  2. 사용하여 예외 핸들러는 당신이해야 할 모든 특히 때, 끔찍한 생각이다 :

    try { 
        // Current code here, including other try-catch blocks 
    } catch (Exception $e) { 
        // handle uncaught exception 
    } 
    
  3. 오류가 올바르게 설정 응답해야 발생합니다. 응답 코드를 500 (내부 서버 오류)로 설정하면 JavaScript가 easly 처리 할 수 ​​있습니다.

    $responseBody = json_encode(array(
        'message' => $e->getMessage(), 
        'code' => $e->getCode() 
    )); 
    
+0

고마워, 내 질문에 모두 답했다. 나는 예외에 대해서뿐만 아니라 오류에 대해서도 걱정하고있다. 이러한 일은 예외적으로 그렇게 분명하게 발생할 수 없습니다. mysql 쿼리가 실패하거나 0으로 나눌 때처럼. – marcusklaas

+0

데이터베이스 연결을 위해 [PDO] (http://pl.php.net/manual/en/book.pdo.php)를 사용하십시오 - 예외를 지원합니다. 사용자 지정 오류 처리기를 사용하면 솔루션 일 수 있지만 코드에서 오류가 발생하지 않아야합니다. – Crozin

+0

+1하지만 php는 stdClass에 예외를 캐스팅하는 것을 지원합니다. $ x = new Exception ("foo"); $ x = (객체) (배열) $ x; 그래서 당신은 그것을 serialize하지 않을 수 있습니다. – edorian

0

하나의 옵션은 사용자 정의 오류 처리기를 설정하고 200 헤더 코드를 보내지 않도록 브라우저에 반향 출력 할 때 shure를 사용하면 오류를 처리 할 수 ​​있습니다.

다른 옵션은

0

글쎄, 여기 당신을 위해 그것을 할 수있는 간단한 함수의 (턴 : 응답 몸과 같이 생성 될 수 있도록

  • Exception 객체는 유용 할 수 있습니다 만 getMessage()getCode() 방법을 제공 액세스 제한을 우회하는 연관 배열에 대한 객체) :

    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)); 
    
  • 관련 문제