Получение «TypeError: аргумент типа« ConnectionAbortedError »не повторяется» при попытке повторить подключение Telnet - PullRequest
2 голосов
/ 11 мая 2019

Чтобы дать полный контекст: мне было поручено подключиться к удаленным устройствам, которые могут обмениваться данными только через 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. Поэтому я думаю, что мой вопрос состоит из двух частей:

  1. Почему эта ошибка происходит в том же месте процесса, но после того, как он некоторое время работал нормально и успешно выполнил эту часть кода?
  2. Как я могу обработать исключения 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
...