2013-02-21 14 views
33

में 500 सर्वर त्रुटि को पकड़ना मुझे फ्लास्क की त्रुटि पकड़ने से प्यार है। यह खूबसूरती से सरल है:फ्लास्क

@app.errorhandler(404) 
def pageNotFound(error): 
    return "page not found" 

आकर्षण की तरह काम करता है। लेकिन यह 500 त्रुटि कोड के लिए काम नहीं करता है। कोड में अपवाद उठाए जाने पर मैं पाइथन त्रुटियों को पकड़ना चाहता हूं। क्या यह संभव है?

मुझे ध्यान रखना चाहिए कि यदि मैं स्पष्ट रूप से return abort(500) को एक दृश्य में कॉल करता हूं तो 500 त्रुटिरोधक काम करता है। तो यह स्पष्ट रूप से तब है जब पाइथन कोड विफल रहता है।

क्या यह संभव है?

+0

क्या आप जो खोज रहे हैं उसे स्पष्ट कर सकते हैं? मुझे समझ में नहीं आता कि आपका क्या मतलब है "जब मैं कुछ गलत करता हूं तो कोड में अपवाद उठाया जाता है तो मैं पाइथन त्रुटियों को पकड़ना चाहता हूं"। क्या आपका मतलब है कि यदि एक सामान्य दृश्य में एक पायथन अपवाद उठाता है, तो आप 500 त्रुटि हैंडलर को स्वचालित रूप से कॉल करने की उम्मीद करते हैं? –

+0

यह सही है, यदि सामान्य दृश्य में कोड 1 से 0 को विभाजित करने या 2-तत्व सरणी में तीसरे तत्व तक पहुंचने या कुछ और करने के लिए करता है जो पाइथन अपवाद उठाता है और अपवाद बेकार है, तो मुझे एक विशेष दृश्य विधि चाहिए चलाने के लिए। '@ App.errorhandler (500)' के साथ सजाए गए एक समारोह को चाल नहीं लगती है। –

उत्तर

23

जो आपने वर्णन किया है, डिफ़ॉल्ट रूप से, फ्लास्क कैसे काम करता है। मेरी धारणा यह है कि आप डीबग मोड में चल रहे हैं, और इसलिए डीबग स्क्रीन में अपवाद आपको दिखाए जा रहे हैं। सुनिश्चित करें कि डीबग मोड बंद है, फिर पुन: प्रयास करें। यहाँ एक comment directly from the code itself:

Default exception handling that kicks in when an exception occurs that is not caught. In debug mode the exception will be re-raised immediately, otherwise it is logged and the handler for a 500 internal server error is used. If no such handler exists, a default 500 internal server error message is displayed.

+0

यदि आप डीबग मोड के साथ प्रयास करते हैं और यह अभी भी काम नहीं कर रहा है, तो कृपया अपना अधिक कोड पोस्ट करें। –

+1

एक बार जब मैंने डीबग मोड अक्षम कर दिया, तो आप सही हैं, फिर यह काम किया। यह बात बताने के लिए धन्यवाद। मैं डीबग मोड का उपयोग करता हूं ताकि जब मैं विकास के दौरान परिवर्तन करता हूं तो कोड स्वत: पुनः लोड हो जाता है। डीबग मोड के बिना ऑटो-रीलोडिंग करने का कोई तरीका है? –

+0

रुको, क्या? मैंने अभी डीबगिंग चालू कर दिया है और 500 त्रुटि हैंडलर अभी भी काम करता है और मुझे स्वचालित कोड रीलोडिंग मिलती है! डीबग मोड को फिर से बंद करना मतलब है कि 500 ​​हैंडलर अभी भी काम करता है और कोड पुनः लोड नहीं होता है (समझ में आता है), लेकिन फिर से डीबगिंग चालू करना 500 हैंडलर काम करता रहता है। यह मेरे लिए अच्छा है, लेकिन संदिग्ध है। –

17

यह मेरी टीम में ठीक काम करता है:

from flask import Flask ,url_for,render_template,request,abort 
from werkzeug.debug import get_current_traceback 
app = Flask(__name__) 

@app.route('/') 
def index(): 
    try: 
     raise Exception("Can't connect to database") 
    except Exception,e: 
     track= get_current_traceback(skip=1, show_hidden_frames=True, 
      ignore_system_exceptions=False) 
     track.log() 
     abort(500) 
    return "index" 

@app.errorhandler(500) 
def internal_error(error): 

    return "500 error" 

@app.errorhandler(404) 
def not_found(error): 
    return "404 error",404 

if __name__== "__main__": 
    app.run(debug=True) 

बोतल आप के लिए त्रुटि कोड सेट नहीं होगा, इसलिए भी जब एक प्रतिक्रिया लौटाएँ HTTP स्थिति कोड प्रदान करना सुनिश्चित करें।

+3

यदि आप 'DEBUG = True' का उपयोग करते हैं तो यह काम नहीं करेगा (प्रिंट स्टैकट्रैक), यह आराम से विकास पर है। तो यदि आप वास्तविक 500 पेज देखना चाहते हैं तो जांचें कि फ्लास्क एप्लिकेशन DEBUG मोड पर नहीं चलता है। – tbicr

+0

मैं उलझन में हूं, आप चाहते हैं कि फ्लास्क अपवाद को संभालें या आप अपवाद को ग्राहक बनाना चाहते हैं? – Joe

+0

संभाल संभाल। मेरा मतलब है कि जब आप विकसित करते हैं तो आप डीबग मोड का उपयोग करते हैं और थोड़ा सा भ्रमित हो सकता है जब आपकी 500 त्रुटि के बजाय सुंदर पृष्ठ नहीं है। – tbicr

13
यहाँ

मेरी कोड snippt

@app.route('/') 
def index(): 
    raise Exception("Can't connect to database") 


@app.errorhandler(Exception) 
def exception_handler(error): 
    return "!!!!" + repr(error) 
+0

'app.debug' मेरे लिए काम नहीं किया, इसलिए यह मुझे बचाया! धन्यवाद! – JeromeJ

6

इस मेरे समाधान, अपवाद के प्रसार को चालू करने के config शब्दकोश संशोधित करके था है:

app = Flask(__name__) 
... 
app.config['PROPAGATE_EXCEPTIONS'] = True 

देखो इस अन्य संबंधित प्रश्न पर: Flask app raises a 500 error with no exception

+2

धन्यवाद !! मैं अपने बालों को फाड़ रहा था और अंत में इस लाइन को जोड़कर 'मुझे एक हड्डी फेंक दिया' ताकि मैं इसे समझ सकूं। मुझे 500 त्रुटियों से नफरत है! वे सिर्फ 'त्रुटि क्यों नहीं डालते: कुछ हुआ';) – Mike