2017-10-20 29 views
0

J'ai un serveur de transfert de fichiers simple qui utilise socket, Il a une écoute infinie de clients boucle dans la fonction Main(), donc je l'ai entouré de Try/Except avec KeyboardInterrupt donc je voudrais être en mesure de bien fermer toutes les prises et les connexions lorsque CTRL + C-tion surEssayer/Sauf attraper UnboundLocalError sur KeyboardInterrupt

def Main(): 
    try: 
     #various variable initations 
     sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
     sock.bind((host,port)) 
     print 'Socket bound to host - {0} and port {1}'.format(host,port) 

     sock.listen(5) 

     print 'Waiting for connections...' 

     while True: 
      conn, addr = sock.accept() 
      print 'Client IP:',str(addr) 
      #getting data from client and making the server do the appropriate functions 

     conn.close()   
     sock.close() 
    except(KeyboardInterrupt): # redundancy to make sure that a keyboard interrupt to close the program also closes the sockets and connections 
     conn.close() 
     sock.close() 
     print 'Manual Close' 
     sys.exit() 

maintenant, lorsqu'un client se connecte et fait tout et je la ferme via le clavier d'interruption, il fonctionne très bien, je l'impression du « Fermer Manuel »

Mais quand je ferme par clavierinterruption avant qu'un client se connecte il me donne cette erreur: UnboundLocalError: local variable 'conn' referenced before assignment

Je comprends les conn ne sont pas affectés si un client ne se connecte pas, mais je pense que toute erreur sous except ignorés

Répondre

0

Vous pouvez simplement mettre les fonctions au sein du bloc, sauf dans un autre try/except et lui dire pour ignorer l'exception avec réussite

except(KeyboardInterrupt): # redundancy to make sure that a keyboard interrupt to close the program also closes the sockets and connections 
    try: 
     conn.close() 
     sock.close() 
    except: 
     pass 
    print 'Manual Close' 
    sys.exit() 
+0

Il est possible que 'sock' soit valide, mais que' conn' ne soit pas; ce code laisserait 'sock' ouvert dans ce cas. Pas que ça compte vraiment, puisque quitter le programme ferme toutes les sockets de toute façon. – jasonharper

+0

@jasonharper Je suppose que vous pouvez envelopper à la fois 'conn' et' sock' dans un 'try/except' individuel et je suis à peu près certain que cela fonctionnerait mais je ne sais pas si c'est la meilleure pratique pour le faire – Muffinator