Обработка исключений Python-сокетов не выдает ошибки в первой итерации - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь написать простой клиент системного журнала.

Это работает довольно хорошо и приводит к исключению, когда сервер системного журнала неожиданно завершает работу.Единственная проблема, которую я обнаружил во время отладки, заключается в следующем:

Когда я выключаю сервер системного журнала, он сразу не выдает исключение, когда я пытаюсь отправить сообщение.Он генерирует исключение только после следующей итерации, когда сервер системного журнала не работает.Поэтому в основном я потеряю одно сообщение.

Пожалуйста, посмотрите пример / шаги ниже:

1.) Сервер системного журнала запущен, я отправляю первое сообщение "test1" из цикла for, этоявляется успешным.

2.) Я выключаю сервер системного журнала, теперь я отправляю второе сообщение «test2» из цикла for (во время отладки).Ничего не происходит, нет исключений!

3.) Я отправляю третье сообщение «test3», теперь выдается исключение.

Как это возможно?Почему он не генерирует исключение в первой итерации, когда сервер системного журнала не работает?

class Syslog:
  def __init__(self,host="localhost",port=514,facility=Facility.DAEMON):
    self.host = host
    self.port = port
    self.facility = facility
    self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  def connect(self):
    try:
        self.socket.connect((self.host, self.port))
    except Exception as e:
        print("failed setting up connection")


  def send(self, message,level):
    data = "<%d>%s" % (level + self.facility*8, message + "\n")
    try:
        self.socket.sendall(data.encode('utf-8'))
    except Exception as e:
        print("send failed")

#if __name__ == '__main__':
syslog1 = Syslog(host='HOSTIPADDRESS-NAME')
syslog1.connect()
messages = ["test1","test2","test3","test4","test5","test6","test7"]

for message in messages:
    syslog1.send(message,Level.WARNING)
...