2017-10-18 1 views
0

Ich schreibe Anwendung in Python mit Asyncio für die Vernetzung. Ich habe Code ähnlich auch:Warum verursacht StreamReader.readexactly() einen Socket-Fehler, aber nicht StreamReader.read()?

try: 
    data = await self._reader.readexactly(10000) 

    # Code that uses data 
except IncompleteReadError as e: 
    data = e.parial 
    # More code 

Wenn ich versuche, diesen Code auszuführen, scheint es nie tatsächlich zu laufen. Wenn ich einen Haltepunkt in der zweiten Zeile festlege, wird der Haltepunkt ausgelöst, aber der Rest der Funktion wird ignoriert.

Das nächste, was ich auf einen Fehler bekommen, ist dies vom asyncio Logger:

Traceback (most recent call last): 
    File "c:\python36\Lib\asyncio\selector_events.py", line 724, in _read_ready 
    data = self._sock.recv(self.max_size) 
ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine 

Ersetzen der zweiten Zeile mit data = await self._reader.read(10000) dieses Problem zu lösen scheint, aber read() nicht mein Problem zu lösen, muss ich Verwenden Sie readexactly(). Warum verursacht readexactly() einen Socket-Fehler, aber read() nicht?

Antwort

0

der einzige Unterschied zwischen den beiden ist, dass bis n Bytes lesen „lesen“, während readexactly liest genau n Bytes und wenn das Ende erreicht, bevor n Bytes löst eine IncompleteReadError, die Ihre Steckdose verursachen um den Fehler zu erhalten, auf den Sie hingewiesen haben.

+0

Warum wird dann nicht der Ausnahmeblock ausgeführt? Die Funktion endet nur vollständig in dieser Zeile. – ILikePizza555

+0

weil Sie nur "IncompleteReadError" abfangen, versuchen Sie das zu "Exception" zu ändern und sehen Sie, ob der except-Block ausgeführt wird und welcher Exception-Typ ausgelöst wird – ddor254

Verwandte Themen