2013-07-22 14 views
7

uruchomić prostą aplikację kolbą tak:Jak złapać wyjątek w ten sposób na Flask?

from flask import Flask 

app = Flask(__name__) 

@app.route('/') 
def welcome(): 
    return "OK" 


app.config.update(
    DEBUG = True 
) 

if __name__ == '__main__': 
    app.run(use_reloader = False) 

gdy uruchamiam go i odwiedzić go, czasami (nie zawsze) to could't odpowiedzi jako żądanie i rzucać wyjątkiem:

Exception happened during processing of request from ('127.0.0.1', 54481) 
Traceback (most recent call last): 
    File "c:\python27\Lib\SocketServer.py", line 295, in _handle_request_noblock 
    self.process_request(request, client_address) 
    File "c:\python27\Lib\SocketServer.py", line 321, in process_request 
    self.finish_request(request, client_address) 
    File "c:\python27\Lib\SocketServer.py", line 334, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "c:\python27\Lib\SocketServer.py", line 651, in __init__ 
    self.finish() 
    File "c:\python27\Lib\SocketServer.py", line 710, in finish 
    self.wfile.close() 
    File "c:\python27\Lib\socket.py", line 279, in close 
    self.flush() 
    File "c:\python27\Lib\socket.py", line 303, in flush 
    self._sock.sendall(view[write_offset:write_offset+buffer_size]) 
error: [Errno 10053] 

Nie rozumiem, co to za wina? i jak mogę to rozwiązać?

i jak mogę użyć try except, aby go złapać?

Odpowiedz

-3

Jest to prawdopodobnie spowodowane użyciem numeru portu, który wynosi 54481, patrząc na komunikat o błędzie. Być może ściera się z czymś innym. Proponuję również nie używać parametru use_reloader, ponieważ twój DEBUG jest już ustawiony na False. Tak więc kolba nie przeładuje żadnych zmian kodu. Można zamiast tego zrobić:

if __name__ == '__main__': 
    app.run(port=5000) 
+3

I nie sądzę, że odpowiedź jest poprawna, ponieważ 54481 port to port żądanie (tj. z przeglądarki internetowej). – HolgerSchurig

+1

Ale domyślnie w kolbie jest używany port 5000: https://github.com/mitsuhiko/flask/blob/master/flask/app.py#L766. W twoim przykładzie Twoja aplikacja nie powinna działać z portem 54481 dla serwera dev. – tbicr

+0

FWIW, natknąłem się na ten sam problem, używam niestandardowego portu i mam wyłączone debugowanie. Myślę, że sugerowanie innego portu to czerwony śledzia. –

10

Niedawno wpadłem na ten komunikat o błędzie podczas próby użycia kolby służyć plików audio. Otrzymuję ten komunikat o błędzie, gdy klient zamyka strumień przed końcem strumienia.

Ten komunikat o błędzie nie pochodzi z aplikacji Flask, lecz z bazowego serwera SocketServer używanego do wysyłania danych żądania. Co się dzieje, połączenie z klientem kończy się z jakiegoś powodu, ale Flask nadal próbuje zapisać dane do zamkniętego gniazda. Nie możesz wychwycić tego wyjątku z aplikacji Flask, ponieważ Flask przyłapuje go dla Ciebie. Kolba drukuje go jako usługę dla Ciebie, powiadamiając Cię, że strumień został zamknięty przedwcześnie, tj. Zanim Flask zakończył zapisywanie danych w strumieniu.

Podsumowując, ten komunikat o błędzie jest wewnętrzny dla Flask, Flask drukuje go, aby powiedzieć, że nie mógł uzyskać wszystkich danych do klienta przed zamknięciem połączenia. Nie możesz go złapać i nie powinieneś mieć żadnego powodu, by go złapać.

+2

Zgadza się. Nie jest to tak naprawdę błąd skrzynki, ale błąd wewnętrznego serwera WWW, że nie można wysłać wszystkich danych do klienta, ponieważ połączenie zostało zamknięte. Może się to zdarzyć, jeśli szybko naciśniesz ponownie lub zatrzymasz się, gdy strona wciąż się ładuje. Nie powinieneś używać wewnętrznego serwera w produkcji, wszystko jest w porządku. – Bastian

+0

Dzięki za wyjaśnienie.To doprowadzało mnie do szału. Więc to nie jest błąd, trudne wiadomości są denerwujące. @ user305883 Widzę tylko fioletowego ducha między dużym 404 po kliknięciu w ten link. – muammar

+0

@muammar https://www.odoo.com/forum/help-1/question/self-sock-sendall-broken-pipe-means-28296 Spróbuj ponownie, jeśli jest przydatna. – user305883

0

Znalazłem to rozwiązanie jako dobrą, przynajmniej tymczasową, poprawkę.

if __name__ == '__main__': 
    while True: 
    try: 
     app.run(use_reloader = False) 
    except: 
     pass 

Możesz dodać własną logikę wyjścia lub opuścić program za pomocą CTRL + \, który wysyła SIGQUIT. (Ważne, jeśli używasz kolba gwintowane)

Ty jednak nie może:

except KeyboardInterupt: 

Ponieważ Kolba już łapie KeyboardInterupt wyjątki i obsługuje je.

błąd 10052 oznacza używasz systemu Windows, więc o ile wiem, zamknij okno poleceń, aby wyjść z programu

+0

Nie myśl, że to złapie ten błąd. –

Powiązane problemy