Python-socket-Programmierung - Ausnahmebehandlung
Arbeite ich an einem basic-socket-client-Programm in python und ich bin mir nicht ganz sicher, wie Sie Sie behandeln von Ausnahmen. Dies ist, was ich getan habe bis jetzt:
TCP_IP = '..............'
TCP_PORT = 4950
MESSAGE = "o3"
BUFFER_SIZE = 2048
data = ""
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5.0)
try:
s.connect((TCP_IP, TCP_PORT))
except socket.error:
#write error code to file
s.close()
try:
s.sendall(MESSAGE)
except socket.error:
#write to file or whatever
s.close()
try:
data = s.recv(BUFFER_SIZE)
except socket.error:
#write to file or whatever
s.close()
finally:
s.close()
Den code so funktioniert, wie ich will, aber ich bin mir nicht sicher, ob ich sollte verschachteln von try/catch-Blöcken oder nicht? Sollte ich socket.socket
in try - /catch-block zu?
Zweite Frage, was wird s.settimeout()
in meinem Fall tun? Soweit ich das verstanden Sie in der Dokumentation, es wird eine Ausnahme nach 5 Sekunden, aber für was? Nur connect
oder wird es das gleiche tun für sendall
und recv
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Sie exakt die gleichen Aktionen in allen Ausnahme-Blöcke und Fang der gleichen
socket.error
Ausnahme, Sie könntens.connect
,s.sendall
unds.recv
im gleichentry:
block. Etwa so:Beachten Sie, dass seit
s.close
ist auch in derfinally
Abschnitt in deinem Beispiel, es wird immer aufgerufen, auch wenn eine Ausnahme aufgetreten ist. So würden Sie am Ende mit einer weiteren Ausnahme, die Auftritt, wenn Sie versuchen, schließen eines bereits geschlossenen sockel. Indem Sie nicht in dieexcept
block und nur infinally
Sie können diese situation vermeiden.Wenn Sie beabsichtigen zu behandeln, alle Fehler in einer anderen Weise, dann können Sie uns diese getrennt als Sie bereits haben. Aber stellen Sie sicher, dass
break
/return
am Ende des exception-block, so dass Sie nicht versuchen, die nächste. Es ist getan, der Weg in die socket-Beispiele, durch die Verwendung einescontinue
in der Schleife.Verschachtelung Ihnen helfen würde, wenn Sie wollte etwas anderes in den exception-block. Aber wenn nicht würden Sie die Wiederholung der
except
block jede Zeit. Und wenn Sie wollten, etwas anderes zu tun, wenn Sie beenden die nested-try
s, Sie würden nicht sicher sein, welches level es hat, abgeschlossen oder erhöht eine Ausnahme - müssen Sie verwenden, flag-Werte usw. lediglich Spur. Also für dein Beispiel mit dem gleichen Fehler-handling-code, zumindest, etwas tun, wie dieses in Ihremexcept
block:Tun Sie das in den Beispielen weiter oben verlinkt.
Abgesehen von der Protokollierung, Sie sollte nicht wirklich die gleiche exception-handling in jeder Phase. Wahrscheinlich benötigen, um mit diesen separat.
Teil 2:
s.settimeout(5.0)
setzt das timeout für socket-operation, nicht nur beim ersten verbinden. Auch impliziert, dass es in blocking-Modus.