2012-10-02 9 views

Odpowiedz

44

Można zrobić coś takiego w PHP (zakładając, że ta jest wywoływana za pośrednictwem AJAX):

<?php 

try { 
    if (some_bad_condition) { 
     throw new Exception('Test error', 123); 
    } 
    echo json_encode(array(
     'result' => 'vanilla!', 
    )); 
} catch (Exception $e) { 
    echo json_encode(array(
     'error' => array(
      'msg' => $e->getMessage(), 
      'code' => $e->getCode(), 
     ), 
    )); 
} 

W javascript:

$.ajax({ 
    // ... 
    success: function(data) { 
     if (data.error) { 
      // handle the error 
      throw data.error.msg; 
     } 
     alert(data.result); 
    } 
}); 

Można również wywołać procedurę obsługi z $ .ajax error: () zwracając 400 (na przykład) nagłówek:

header('HTTP/1.0 400 Bad error'); 

Lub użyj Status: jeśli korzystasz z FastCGI. Zwróć uwagę, że program obsługi error: nie otrzymuje szczegółów błędu; Aby to osiągnąć, musisz nadpisać jak działa $.ajax() :)

+0

Dzięki. Czy mimo to wywołać wywołanie zwrotne błędu ajax jquery? – madphp

+0

@madphp Tak, po prostu zwróć kod http 400 używając nagłówka() –

+0

A dla PHP> = 5.4 możesz użyć 'http_response_code (400);' – PhoneixS

6

Facebook zrobić coś w swoim pakiecie SDK PHP, gdzie wyrzucają wyjątek, jeśli żądanie HTTP nie powiodło się z jakiegokolwiek powodu. Można przyjąć takie podejście, i po prostu przywrócić dane o błędach i wyjątek, jeśli jest wyjątek:

<?php 

header('Content-Type: application/json'); 

try { 
    // something; result successful 
    echo json_encode(array(
     'results' => $results 
    )); 
} 
catch (Exception $e) { 
    echo json_encode(array(
     'error' => array(
      'code' => $e->getCode(), 
      'message' => $e->getMessage() 
     ) 
    )); 
} 

Następnie można tylko słuchać na klucz w swoim AJAX error wywołuje w JavaScript:

<script> 
    $.getJSON('http://example.com/some_endpoint.php', function(response) { 
     if (response.error) { 
      // an error occurred 
     } 
     else { 
      $.each(response.results, function(i, result) { 
       // do something with each result 
      }); 
     } 
    }); 
</script> 
4

Jeśli wszystkie błędy powinny być traktowane w ten sam sposób (np. Pokazujące okno dialogowe). Można zrobić to w ten sposób:

PHP Koniec:

public function throwJsonException($msg) { 
    echo json_encode(array('error'=> true, 'msg' => $msg)); 
} 

throwJsonException('login invalid!'); 

jQuery Koniec:

$(document).ajaxSuccess(function(evt, request, settings){ 
    var data=request.responseText; 
    if (data.length>0) { 
     var resp=$.parseJSON(data); 
     if (resp.error) 
     { 
      showDialog(resp.msg); 
      return; 
     }     
    }  
}); 
0

Jako uzupełnienie do poprzednich odpowiedzi, zamiast powtarzać tego samego kodu do kodowania json w wszystkie twoje wyjątki, możesz ustawić obsługę wyjątków, która będzie używana tylko w potrzebnych skryptach. Na przykład:

function ajaxExceptionHandler($e) { 
    echo json_encode(array(
     'error' => array(
     'code' => $e->getCode(), 
     'msg' => $e->getMessage()) 
    )); 
} 

Następnie w ajax obsługi,

set_exception_handler('ajaxExceptionHandler'); 
Powiązane problemy