Mam następujący kod:

try:
    connSock = socket(AF_INET, SOCK_STREAM)
    connSock.connect((tgtHost, tgtPort))
except:
    pass
finally:
    connSock.close()

Pycharm mówi, że:

Zmienna lokalna "Connsock" może być odwołana przed przypisaniem na linii Connsock.Close ()

Jak to jest w ogóle możliwe?

Czy coś mi brakuje?


AKTUALIZACJA:

Funkcja gniazda () może wzbudzić wyjątek, jeśli system operacyjny zabrakło z deskryptorów

1
Yetti 14 sierpień 2014, 22:25

3 odpowiedzi

Najlepsza odpowiedź

Jeśli wywołanie socket() w drugiej linii podnosi wyjątek, a następnie connSock nigdy nie jest związany.

Gniazda mogą być używane jako menedżerowie kontekstu, wykorzystują to na swoją korzyść:

try:
    with socket(AF_INET, SOCK_STREAM) as connSock:
        connSock.connect((tgtHost, tgtPort))
except socket.error:
    pass

To zamknie gniazdo, gdy zostanie wyszedł z bloku with, bez konieczności odniesienia do niego i tylko wtedy, gdy wywołanie socket()

Zauważ, że powinieneś rzadko , użyj kocu except: pass. Lepiej złapać określone wyjątki.

7
Martijn Pieters 14 sierpień 2014, 18:31

socket(AF_INET, SOCK_STREAM) może rzucić wyjątek, tak aby connSock nigdy nie zostanie przypisany. Następnie, connSock.close() nie może pracować.

3
hlt 14 sierpień 2014, 18:27

Jeśli blok try podnosi błąd (w szczególności w pierwszej linii connSock = socket(AF_INET, SOCK_STREAM)), connSock nie zostanie zdefiniowany, gdy blok finally jest wykonywany.

1
Alex Riley 14 sierpień 2014, 18:32