首页 > 解决方案 > Python 套接字异常处理在第一次迭代中不会引发错误

问题描述

我正在尝试编写一个简单的系统日志客户端。

这工作得很好,当系统日志服务器意外关闭时会遇到异常。现在我在调试时发现的唯一问题如下:

当我关闭系统日志服务器时,当我尝试发送消息时它不会立即引发异常。它只会在 syslog 服务器关闭时在下一次迭代后引发异常。所以基本上我会丢失一条消息。

请参阅以下示例/步骤:

1.)系统日志服务器启动,我从for循环发送第一条消息“test1”,这是成功的。

2.)我关闭了系统日志服务器,现在我从 for 循环发送第二条消息“test2”(调试时)。什么都没有发生,也不例外!

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)

标签: pythonsyslog

解决方案


推荐阅读