python - 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)
解决方案
推荐阅读
- oop - DDD:我可以将域服务作为聚合构造函数的参数传递吗
- javascript - Javascript 为什么不能在 eval() 中使用 let
- python - 如何在后台调度 Python Selenium 脚本?
- httpclient - RestSharp 到 HTTPClient RequestBody
- hibernate-tools - HibernateTools hbm2ddl ant 任务不保留顺序
- javascript - 使用条件语句过滤对象数组
- sql - Sybase SQL:分区上的行号
- javascript - 在 Javascript 中访问对象的对象
- database - 如何修复安装 mongoDB
- nginx - 如何在带有 nginx 的 debian 9 服务器上通过 https 从 phpmyadmin 发送数据?