2017-10-18 10 views
0

J'écris une application en python en utilisant Asyncio pour la mise en réseau. J'ai le code similaire aussi:Pourquoi StreamReader.readexactly() provoque une erreur de socket mais pas StreamReader.read()?

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

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

Lorsque j'essaye d'exécuter ce code, il ne semble jamais réellement fonctionner. Si je définis un point d'arrêt sur la deuxième ligne, le point d'arrêt se déclenchera, mais le reste de la fonction sera ignoré.

La chose la plus proche que je reçois une erreur est-ce de l'enregistreur asyncio:

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 

Remplacement de la deuxième ligne avec data = await self._reader.read(10000) semble résoudre ce problème, mais read() ne résout pas mon problème, je dois utilisez readexactly(). Alors pourquoi readexactly() provoque une erreur de socket mais read() pas?

Répondre

0

la seule différence entre les deux est que « lire » lire jusqu'à à n octets en lit readexactly exactement n octets et si la fin avant que n octets est soulève une IncompleteReadError, ce qui peut causer votre prise pour obtenir l'erreur que vous avez signalée.

+0

Pourquoi le bloc except n'est-il pas exécuté? La fonction se termine juste complètement à cette ligne. – ILikePizza555

+0

car vous ne voyez que "IncompleteReadError", essayez de le remplacer par "Exception" et vérifiez si le bloc except est exécuté et quel type d'exception est lancé – ddor254