2012-10-02 25 views
24

के माध्यम से php अपवाद फेंकने का क्लीन तरीका क्या एक जेसन प्रतिक्रिया jquery/AJAX कॉल के माध्यम से php अपवादों को फेंकने का एक साफ, आसान तरीका है।jquery/AJAX और json

+1

क्यों आप एक अपवाद फेंक करना चाहते हैं? यह एक त्रुटि स्थिति को वापस करने के लिए बेहतर होगा जो अपवाद को ट्रिगर नहीं करता है। – doublesharp

+2

मेरा मतलब है कि मैंने सर्वर की तरफ पकड़ने की कोशिश की है, और मैं त्रुटि संदेश को जेसन प्रतिक्रिया में रखना चाहता हूं। – madphp

उत्तर

44

आप PHP में कुछ इस तरह (इस 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(), 
     ), 
    )); 
} 

जावास्क्रिप्ट में:

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

तुम भी $ .ajax की error: हैंडलर (ट्रिगर कर सकते हैं) 400 लौटने (उदाहरण के लिए) शीर्षलेख:

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

या Status: का उपयोग करें अगर आप फास्टसीजीआई पर हैं। ध्यान दें कि error: हैंडलर को त्रुटि विवरण प्राप्त नहीं होता है; यह पूरा करने के लिए कि आपको $.ajax() कैसे काम करता है :)

+0

धन्यवाद। Jquery AJAX त्रुटि कॉलबैक ट्रिगर करने के लिए वैसे भी है? – madphp

+0

@madphp हां, हेडर का उपयोग करके बस http कोड 400 लौटें() –

+0

और PHP> = 5.4 के लिए आप 'http_response_code (400);' – PhoneixS

6

फेसबुक अपने PHP एसडीके में कुछ करता है, जहां किसी भी कारण से HTTP अनुरोध विफल हो जाता है, तो वे अपवाद फेंक देते हैं। आप इस दृष्टिकोण ले सकता है, और अगर एक अपवाद फेंक दिया जाता है सिर्फ त्रुटि और अपवाद विवरण वापसी:

<?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() 
     ) 
    )); 
} 

फिर आप सिर्फ अपने AJAX में error कुंजी के लिए सुन सकते हैं जावास्क्रिप्ट में कॉल:

<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

यदि सभी त्रुटियों का एक ही तरीके से व्यवहार किया जाना चाहिए (उदाहरण के लिए एक संवाद दिखा रहा है)।

पीएचपी अंत::

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

throwJsonException('login invalid!'); 

jQuery अंत: आप इसे इस तरह से कर सकते हैं

$(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

पिछले जवाब के लिए एक पूरक के रूप में, बजाय में json एन्कोडिंग के लिए एक ही कोड दोहराने की आपके सभी अपवाद, आप केवल एक आवश्यक स्क्रिप्ट में उपयोग करने के लिए एक अपवाद हैंडलर सेट कर सकते हैं। उदाहरण के लिए:

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

फिर, अपने ajax हैंडलर में,

set_exception_handler('ajaxExceptionHandler');