Чтобы дать полный контекст: мне было поручено подключиться к удаленным устройствам, которые могут обмениваться данными только через telnet, посылать некоторые команды, а затем получать и анализировать потоки данных из них. Я перетаскиваю список устройств из базы данных в массив и перебираю его, с подключением telnet для каждого.
Когда соединение telnet неожиданно обрывается, я получаю эту ошибку:
ConnectionAbortedError: [WinError 10053] Установленное соединение было прервано программным обеспечением на вашем хост-компьютере
Я поместил кусок try-catch вокруг кода подключения telnet, но когда соединение прерывается, я также получаю эту ошибку:
TypeError: аргумент типа 'ConnectionAbortedError' не может быть повторен
Кроме этого, я не уверен, что я могу сделать. Некоторое время процесс выполняется нормально, но затем возникает ошибка, следующая за частью кода tn.write(str(command + "\n").encode("ascii"))
, каждый раз.
Host = "XX.XX.XX.XX"
Port = "10" + devicenumber
print(Host)
print(Port)
# Letting you know we're attempting a connection :)
print(colored("Connecting to..." + Host + " " + Port, 'green'))
# Allow up to 3 retries to execute the telnet connection
for i in range(0, 3):
while True:
try:
# Set variable to the Telnet class, passing in the host and port defined above
tn = telnetlib.Telnet(Host, Port)
tn.set_debuglevel(9)
# Each sleep is to allow time for the stream to complete
time.sleep(1)
# \x01 is the ^A command you would enter if running commands manually.
tn.write("\x01".encode("ascii"))
time.sleep(1)
# Write the supplied command, press enter
tn.write(str(command + "\n").encode("ascii"))
except socket.error as err:
if "Operation timed out" in err:
print
"1st if", self.host, err # progress checking
dialTestResult[self.host] = ["", "connection timed out"]
elif "getaddrinfo failed" in err:
print
"2nd if", self.host, err # progress checking
dialTestResult[self.host] = ["", "DNS resolution failed"]
print("There was an error and we're trying again.")
time.sleep(3)
continue
except WindowsError:
print(colored("The local machine closed the connection. We're trying again.", 'red'))
time.sleep(3)
continue
except ConnectionAbortedError:
print(colored("Connection aborted error! We're trying again.", 'red'))
time.sleep(3)
continue
break
Я просто хотел бы повторить попытку подключения несколько раз после того, как оно разорвалось, но я не уверен, как это сделать, по-видимому, и не совсем уверен в том, как часть «кроме» в операторе try работает с OSErrors. Поэтому я думаю, что мой вопрос состоит из двух частей:
- Почему эта ошибка происходит в том же месте процесса, но после того, как он некоторое время работал нормально и успешно выполнил эту часть кода?
- Как я могу обработать исключения OSError в операторе try?
Любое руководство очень ценится. Спасибо!
Редактировать: Извините, забыл трассировку
File "C:\Users\Zeb\PycharmProjects\VeederReadings\Telnet.py", line 40, in getveederstream
tn.write(str(command + "\n").encode("ascii"))
File "C:\Users\Zeb\AppData\Local\Programs\Python\Python37\lib\telnetlib.py", line 290, in write
self.sock.sendall(buffer)
ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:/Users/Zeb/PycharmProjects/VeederReadings/GetVeederReadings.py", line 8, in <module>
class GetVeederReadings:
File "C:/Users/Zeb/PycharmProjects/VeederReadings/GetVeederReadings.py", line 50, in GetVeederReadings
i37400Stream = Telnet.VeederTelnet.getveederstream("i37400", storeList[storeListCounter])
File "C:\Users\Zeb\PycharmProjects\VeederReadings\Telnet.py", line 49, in getveederstream
if "Operation timed out" in err:
TypeError: argument of type 'ConnectionAbortedError' is not iterable
Process finished with exit code 1