विषय पर बढ़ें

अपवाद

te की अनुमति देता है आप स्थापित करने के लिए कस्टम अपवाद हैंडलर को संभालने के लिए कैसे वापस करने के लिए एक प्रतिक्रिया जब एक त्रुटि या संभाला अपवाद होता है ।

te.से आयात
से te.आयात HTTPआयात
स्टारलेट से। अनुरोध आयात अनुरोध
से te.आयात HT


HTML_404_PAGE = ...
HTML_500_PAGE = ...


Ac def not_found (अनुरोध: अनुरोध, exc: HTTPException):
    HTरिस्पांस लौटें (content=HTML_404_PAGE, status_code = exc. status_code)

Ac def server_error (अनुरोध: अनुरोध, exc: HTTPException):
    HTरिस्पांस लौटाएं (content=HTML_500_PAGE, status_code = exc. status_code)


अपवाद_हैंडलर = {
    404: नहीं_मिला,
    500: सर्वर _ त्रुटि
}

ऐप = स्टारलेट (मार्ग = मार्ग, अपवाद _ हैंडलर = अपवाद _ हैंडलर)

अगर debug यदि सक्षम है और कोई त्रुटि होती है, तो te स्थापित 500 हैंडलर के बजाय बैकट्रेस प्रतिक्रिया का उपयोग करेगा।

ऐप = स्टारलेट (डिबग = सच, मार्ग = मार्ग, अपवाद _ हैंडलर = अपवाद _ हैंडलर)

विशिष्ट स्थिति कोड के लिए हैंडलर पंजीकृत करने के अलावा, आप अपवाद वर्गों के लिए हैंडलर भी पंजीकृत कर सकते हैं।

विशेष रूप से, आप अंतर्निहित को ओवरराइड करना चाह सकते हैं HTTPException क्लास हैंडलिंग। उदाहरण के लिए, JSON- शैली प्रतिक्रिया का उपयोग करना:

Ac def http://exception (अनुरोध: अनुरोध, exc: HTTPException):
    JSONरिटर्न ({"detail": exc.detail}, status_code = exc. status_code)

अपवाद_हैंडलर = {
    HTTPException: http://exception
}

HTTPException यह भी सुसज्जित है headers पैरामीटर। यह हेडर को प्रतिक्रिया वर्ग में प्रचारित करने की अनुमति देता है:

Ac def http://exception (अनुरोध: अनुरोध, exc: HTTPException):
    रिटर्न JSON(
        {"detail": exc.detail},
        स्थिति _ कोड = exc। स्थिति _ कोड,
        हेडर = .ers
    )

आप अधिलेखित करना भी चाह सकते हैं WebSocketException इससे कैसे निपटें:

Ac def websocket_exception (वेबसॉकेट: वेबसॉकेट, exc: वेबसॉकेट Exception):
    प्रतीक्षा करें websocket. (code = 1008)

अपवाद_हैंडलर = {
    Exception: websoc_ अपवाद
}

त्रुटियां और संभाला अपवाद

नियंत्रित अपवादों और त्रुटियों के बीच अंतर करना महत्वपूर्ण है।

हैंडल किए गए अपवाद एक त्रुटि स्थिति का प्रतिनिधित्व नहीं करते हैं। उन्हें एक उपयुक्त HTप्रतिक्रिया में मजबूर किया जाता है और फिर मानक मिडलवेयर स्टैक के माध्यम से भेजा जाता है। डिफ़ॉल्ट रूप से, उपयोग करें HTTPException किसी भी संभाला अपवाद का प्रबंधन करने के लिए कक्षा।

त्रुटियां कोई अन्य अपवाद हैं जो एप्लिकेशन के भीतर होती हैं। इन स्थितियों को पूरे मिडलवेयर स्टैक में अपवाद के रूप में बुलबुला होना चाहिए। किसी भी त्रुटि लॉगिंग मिडलवेयर को यह सुनिश्चित करना चाहिए कि अपवाद सर्वर के लिए सभी तरह से फिर से उठाया गया है।

वास्तव में, उपयोग की जाने वाली त्रुटि हैंडलिंग है exception_handler[500] या exception_handler[Exception] ... 500 और Exception दोनों कुंजियों का उपयोग किया जा सकता है। नीचे देखें:

Ac def हैंडल _ त्रुटि (अनुरोध: अनुरोध, exc: HTTPException):
    कुछ तर्क करें
    JSONवापसी ({"detail": exc.detail}, status_code = exc. status_code)

अपवाद_हैंडलर = {
    अपवाद: हैंडल _ त्रुटि # या "500: हैंडल _ त्रुटि"
}

यह ध्यान रखना महत्वपूर्ण है कि यदि BackgroundTask एक अपवाद फेंकें, जिसे संभाला जाएगा handle_error फ़ंक्शन प्रक्रियाओं, लेकिन इस बिंदु पर प्रतिक्रिया भेजी गई है। दूसरे शब्दों में, handle_error बनाई गई प्रतिक्रिया को छोड़ दिया जाएगा। यदि प्रतिक्रिया भेजे जाने से पहले त्रुटि होती है, तो प्रतिक्रिया ऑब्जेक्ट का उपयोग किया जाएगा - उपरोक्त उदाहरण में, लौटे के लिए JSONResponse ...

क्रमबद्ध करना व्यवहार को ठीक से संभालने के लिए, Starlette किसी एप्लिकेशन का मिडलवेयर स्टैक निम्नानुसार कॉन्फ़िगर किया गया है:

  • ServerErrorMiddleware - सर्वर पर कोई त्रुटि होने पर 500 प्रतिक्रियाएं वापस आ जाती हैं।
  • स्थापित मिडलवेयर
  • ExceptionMiddleware अपवादों को संभालें और एक प्रतिक्रिया लौटाएं।
  • राउटर
  • समापन बिंदु

HTअपवाद

HTTPException कक्षाएं एक आधार वर्ग प्रदान करती हैं जिसका उपयोग आप किसी भी संभाला अपवाद के लिए कर सकते हैं। ExceptionMiddleware कार्यान्वयन किसी को भी चूक करता है HTTPException एक सादा पाठ HTप्रतिक्रिया लौटाता है।

  • HTTPException(status_code, detail=None, headers=None)

आपको इसे केवल एक मार्ग या समापन बिंदु के भीतर उठाना चाहिए HTTPException इसके बजाय, मिडलवेयर वर्गों को सीधे उचित प्रतिक्रिया वापस करनी चाहिए

वेबसॉकेट अपवाद

आप उपयोग कर सकते हैं WebSocketException क्लास एक वेबसॉकेट एंडपॉइंट के अंदर एक त्रुटि फेंकता है।

  • WebSocketException(code=1008, reason=None)

आप विनिर्देश में परिभाषित किसी भी मान्य कोड को सेट कर सकते हैं।