#python #инспекция_кода #рефакторинг
def rcvdata(cmd,size): global s; s.settimeout(1) try: sendCommand(cmd);data = s.recv(size) except: try: sendCommand(cmd);data = s.recv(size) except: try: sendCommand(cmd);data = s.recv(size) except: try: sendCommand(cmd);data = s.recv(size) except: try: sendCommand(cmd);data = s.recv(size) except: try: sendCommand(cmd);data = s.recv(size) except: s.close() return(data)
Ответы
Ответ 1
def rcvdata(cmd, size): data = None s.settimeout(1) for trying in range(6): try: sendCommand(cmd) data = s.recv(size) except: if trying == 5: # Последняя попытка, неудачная s.close() return data Или если надобности в каких-то действиях после цикла нет, то можно уменьшить вложенность: def rcvdata(cmd, size): s.settimeout(1) for _ in range(6): try: sendCommand(cmd) return s.recv(size) except: pass # Здесь по желанию можно воткнуть time.sleep(1) # Сюда мы попадаем только после шести неудачных попыток s.close() return None Почитайте в любом учебнике Python про циклы. А ещё нехорошо перехватывать ВСЕ исключения, потому что тогда программу невозможно будет закрыть (выход — тоже вполне себе исключения SystemExit и иногда KeyboardInterrupt), а также будут пропущены баги внутри sendCommand. Следует перехватывать только те исключения, которые здесь ожидаются (здесь, наверно, что-то вроде socket.error или IOError). А ещё s.recv(size) не гарантирует, что придёт ровно size байт — в зависимости от качества связи, особенностей ОС, фазы Луны и звёзд на небе может вернуться меньше. А по таймауту — и вовсе просто ноль байт. Не знаю, нужно ли это в вашем конкретном случае, но про это желательно не забывать. В общем, плоховат код всё равноОтвет 2
Предложу свой вариант с задержкой между вызовом recv в 1 секунду и 10 попытками: def rcvdata(cmd, size): global s s.settimeout(1) max_count = 10 while True: try: max_count -= 1 if max_count <= 0: return sendCommand(cmd) data = s.recv(size) return data finally: s.close()Ответ 3
Оставлю и я свой вариант_) def rcvdata(cmd,size): global s; s.settimeout(1) t = 0 while t!=7: try: sendCommand(cmd) data = s.recv(size) except: t+=1 s.close()
Комментариев нет:
Отправить комментарий