Python-Socket-Verbindungsausnahme

8

Ich habe eine Socket-Verbindung und ich möchte die Ausnahmebehandlung verbessern und bin festgefahren. Immer, wenn ich die Funktion socket.connect (server_address) mit einem ungültigen Argument verwende, stoppt das Programm, scheint aber keine Ausnahmen auszulösen. Heres mein Code

%Vor%

Die Klasse sieht vielleicht etwas seltsam aus, aber sie wird verwendet, um Koordinaten von einem anderen Computer zu empfangen, auf dem ARToolKit läuft. Wie auch immer, das Problem ist bei der Funktion connect() :

%Vor%

Wenn ich diese Funktion mit einer zufälligen IP-Adresse und Portnummer anrufe, stoppt das ganze Programm einfach an der Zeile:

%Vor%

Die Dokumentation, die ich gelesen habe, besagt, dass im Falle eines Fehlers eine socket.error-Ausnahme ausgelöst wird. Ich habe es auch mit nur versucht:

%Vor%

Dies wird, wenn ich mich nicht irre, alle Ausnahmen fangen, und trotzdem bringt es kein Ergebnis. Ich wäre sehr dankbar für eine helfende Hand. Ist es auch in Ordnung, Programme mit sys.exit zu beenden, wenn eine unerwünschte Ausnahme auftritt?

Danke

    
erling 22.08.2014, 13:07
quelle

2 Antworten

11

Wenn Sie eine zufällige, aber gültige IP-Adresse und einen Port gewählt haben, versucht socket.connect() , eine Verbindung zu diesem Endpunkt herzustellen. Wenn kein expliziter Timeout für den Socket festgelegt ist, wird er währenddessen blockiert, und schließlich wird ein Timeout ausgelöst, wodurch die Ausnahme socket.error: [Errno 110] Connection timed out ausgelöst wird.

Das Standardzeitlimit auf meinem Computer beträgt 120 Sekunden. Vielleicht warten Sie nicht lange genug, bis socket.connect() zurückkehrt (oder Timeout)?

Sie können versuchen, das Zeitlimit wie folgt zu reduzieren:

%Vor%

Beachten Sie, dass die Ausnahme socket.timeout ist, die von socket.error abgeleitet ist und daher von der obigen except-Klausel abgefangen wird, wenn ein Timeout für den Socket explizit festgelegt wird.

    
mhawke 22.08.2014, 13:48
quelle
4

Das Problem mit Ihrer letzten allgemeinen Ausnahme ist die Platzierung des Doppelpunkts. Es muss nach der gesamten Ausnahme sein, nicht nach der Ausnahmeanweisung. Um alle Ausnahmen zu erfassen, müssen Sie Folgendes tun:

%Vor%

Aber in Python 2.6+ sollten Sie die Anweisung as anstelle eines Kommas wie folgt verwenden:

%Vor%

Ich konnte den Code gut ausführen (beachten Sie, dass Sie ein Tupel zur Verbindungsmethode einwerfen müssen). Wenn Sie nur Socket-Fehler erfassen möchten, müssen Sie die socket.error -Klasse ausschließen. Wie du hast:

%Vor%

Wenn Sie sicherstellen möchten, dass ein Tupel eingegeben wird, fügen Sie einfach eine weitere Ausnahmeschleife hinzu:

%Vor%     
user3960432 22.08.2014 13:36
quelle