Vraag Python socket connectie uitzondering


Ik heb een socket-aansluiting aan de gang en ik wil de exception handling verbeteren en Im vastzitten. Wanneer ik de functie socket.connect (server_address) gebruik met een ongeldig argument, stopt het programma, maar er worden geen uitzonderingen gemaakt. Hier is mijn code

import socket
import sys
import struct
class ARToolkit():

    def __init__(self):
        self.x = 0
        self.y = 0
        self.z = 0
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.logging = False


    def connect(self,server_address):
        try:
            self.sock.connect(server_address)
        except socket.error, msg:
            print "Couldnt connect with the socket-server: %s\n terminating program" % msg
            sys.exit(1)


    def initiate(self):
        self.sock.send("start_logging")

    def log(self):
        self.logging  = True  
        buf = self.sock.recv(6000)
        if len(buf)>0:
            nbuf = buf[len(buf)-12:len(buf)]
            self.x, self.y, self.z = struct.unpack("<iii", nbuf)





    def stop_logging(self):
        print "Stopping logging"
        self.logging = False
        self.sock.close()

De klas ziet er misschien een beetje raar uit maar wordt gebruikt voor het ontvangen van coördinaten van een andere computer met ARToolKit. Hoe dan ook, het probleem zit hem in de functie connect():

def connect(self,server_address):
        try:
            self.sock.connect(server_address)
        except socket.error, msg:
            print "Couldnt connect with the socket-server: %s\n terminating program" % msg
            sys.exit(1)

Als ik die functie opbreek met een willekeurig IP-adres en poortnummer, stopt het hele programma gewoon bij de lijn:

self.sock.connect(server_address)

De documentatie die ik heb gelezen, geeft aan dat in geval van een fout een socket.fout-uitzondering wordt gegenereerd. Ik heb het ook geprobeerd met alleen:

except Exception, msg:

Dit, als ik me niet vergis, zal uitzonderingen vangen en toch levert het geen resultaat op. Ik zou erg dankbaar zijn voor een helpende hand. Is het ook goed om programma's af te sluiten met sys.exit als er een ongewenste uitzondering optreedt?

Dank je


10
2017-08-22 13:07


oorsprong


antwoorden:


Als u een willekeurig, maar geldig IP-adres en -poort hebt gekozen, socket.connect() zal proberen een verbinding te maken met dat eindpunt. Als er geen expliciete time-out is ingesteld voor de socket, wordt deze standaard geblokkeerd tijdens het uitvoeren van de sessie en treedt er uiteindelijk een time-out op, waardoor de uitzondering wordt verhoogd socket.error: [Errno 110] Connection timed out.

De standaardtime-out op mijn machine is 120 seconden. Misschien wacht je niet lang genoeg op socket.connect() om terug te keren (of time-out)?

Je kunt proberen de time-out als volgt te verkorten:

import socket

s = socket.socket()
s.settimeout(5)   # 5 seconds
try:
    s.connect(('123.123.123.123', 12345))         # "random" IP address and port
except socket.error, exc:
    print "Caught exception socket.error : %s" % exc

Merk op dat als een time-out expliciet is ingesteld voor de socket, de uitzondering zal zijn socket.timeout waarvan is afgeleid van socket.error en zal daarom worden gevangen door de bovenstaande uitzonderingsclausule.


13
2017-08-22 13:48



Het probleem met je laatste algemene uitzondering is de dubbele plaatsing. Het moet na de hele uitzondering zijn, niet na de uitzondering. Dus om alle uitzonderingen vast te leggen die u zou moeten doen:

except Exception,msg:

Nochtans van Python 2.6+ zou u de verklaring als in plaats van een komma moeten gebruiken zoals:

except Exception as msg:

Ik kon de code prima uitvoeren (let op dat je een tuple naar de connect-methode moet gooien). Als u alleen socket-fouten wilt vangen, moet u de socket.error klasse. Alsof je hebt:

except socket.error as msg:

Als je zeker wilt weten dat een tuple is ingevoerd, voeg je gewoon een andere uitzonderingslus toe:

except socket.error as msg:
    print "Socket Error: %s" % msg
except TypeError as msg:
    print "Type Error: %s" % msg

4
2017-08-22 13:36