2013-02-21 9 views
33

Uwielbiam przechwytywanie błędów Flask. To jest pięknie proste:Złapanie błędu 500 serwera w kolbie

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

działa jak urok. Ale nie działa dla kodu błędu 500. Chcę złapać błędy Pythona, gdy coś idzie nie tak, wyjątek jest podniesiony w kodzie. Czy to jest możliwe?

Należy zauważyć, że jeśli jawnie zadzwonić return abort(500) w widoku, to obsługa błędu błędu 500 działa. Tak jest wyraźnie w przypadku niepowodzenia kodu Pythona.

Czy to możliwe?

+0

Czy możesz wyjaśnić, czego szukasz? Nie rozumiem, co masz na myśli przez "Chcę złapać błędy Pythona, gdy coś idzie nie tak, wyjątek jest podnoszona w kodzie". Czy masz na myśli to, że jeśli w normalnym widoku podnosi wyjątek Python, oczekujesz automatycznego wywoływania procedury obsługi błędów 500? –

+0

To prawda, jeśli kod w normalnym widoku robi coś takiego jak dzielenie 1 przez 0 lub dostęp do trzeciego elementu w tablicy dwuelementowej lub cokolwiek innego, co podnosi wyjątek Pythona, a wyjątek jest nieprzechwycony, chcę specjalną metodę widoku biegać. Dekorowanie funkcji za pomocą '@ app.errorhandler (500)' nie wydaje się zdziałać. –

Odpowiedz

23

To, co opisałeś, domyślnie działa jak Flask. Zakładam, że uruchamiasz tryb debugowania i dlatego na ekranie debugowania wyświetlane są wyjątki. Upewnij się, że tryb debugowania jest wyłączony, a następnie spróbuj ponownie. Oto 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

Jeśli spróbujesz wyłączyć tryb debugowania i nadal nie działa, opublikuj więcej kodu. –

+1

Masz rację, raz wyłączyłem tryb debugowania, a następnie zadziałało. Dziękuję za wskazanie tego. Używam trybu debugowania, aby kod automatycznie przeładowywał się po wprowadzeniu zmiany podczas programowania. Czy istnieje sposób automatycznego przeładowania bez trybu debugowania? –

+0

Czekaj, co? Właśnie włączyłem debugowanie, a program obsługi błędów 500 nadal działa I otrzymuję automatyczne przeładowanie kodu! Ponowne wyłączenie trybu debugowania oznacza, że ​​program obsługi 500 nadal działa, a kod nie ładuje się ponownie (ma to sens), ale ponowne włączenie debugowania powoduje ponowne działanie programu obsługi 500. To wszystko dla mnie dobre, ale podejrzane. –

17

To działa dobrze w moim boku:

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) 

Kolba nie ustawi kod błędu dla ciebie, więc upewnij się, że również podać kod stanu HTTP po powrocie odpowiedzi.

+3

Jeśli użyjesz 'DEBUG = True', to nie zadziała (wydrukuj stacktrace), wygodnie na rozwoju. Jeśli chcesz zobaczyć prawdziwe 500 stron, sprawdź, czy aplikacja Flask nie działa w trybie DEBUG. – tbicr

+0

Jestem zdezorientowany, chcesz, aby Flask obsługiwał Wyjątek lub chcesz, aby Klient był wyjątkowy? – Joe

+0

Uchwyt ofcourse. Mam na myśli to, że kiedy się rozwijasz, używasz trybu debugowania i możesz odrobinę zdezorientować, gdy twój błąd 500 nie będzie miał przepięknej strony zamiast stosu. – tbicr

13

tutaj jest mój kod 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' nie działa dla mnie, więc to mnie uratowało! dzięki! – JeromeJ

6

Moje rozwiązanie to było włączyć propagacji wyjątkami, przez modyfikację słownika config:

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

Look na to inne powiązane pytanie: Flask app raises a 500 error with no exception

+2

Dziękuję! Odrąbałem włosy i dodałem tę linię w końcu "rzuciłem mi kość" w moim dzienniku, więc mogłem to rozgryźć. Nienawidzę 500 błędów! Dlaczego po prostu nie wpisują "błędu: coś się stało";) – Mike

Powiązane problemy