我正在写一些东西来检查端口是否打开,但是将其修改为我的使用。
我为检查设置了超时,如果超时达到它会引发socket.timeout
异常,但我希望try
内的代码块也可以在socket.timeout
上调用:
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5)
result = sock.connect_ex((check_server_ip, check_port))
if result == 0:
# act on open port
else:
# act on closed port
sock.close()
except socket.timeout:
# act on closed port
我在# act on closed port
上的代码块很长。我可以创建一个包含代码并在else
语句和socket.timeout
异常上调用它的函数,但我敢打赌python有更聪明的东西。
什么能实现这个目标?
答案 0 :(得分:0)
我认为你在这里不需要聪明或神奇的东西。我查看了你的代码,然后在我的终端中输入了python -c "import this"
并在以下行中看到了这一点:
Flat比嵌套好。
所以,你不需要创建,设置超时并关闭try ... except timeout
中的套接字 - 没有什么会在那里引发超时:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5)
try:
result = sock.connect_ex((check_server_ip, check_port))
socket_connected = result == 0
except socket.timeout:
socket_connected = False
if socket_connected:
do_connected_stuff()
else:
do_disconnected_stuff()
sock.close()
但是,此代码的正确性实际上取决于do_connected_stuff()
是否可以抛出socket.timeout
,而do_disconnected_stuff()
在这种情况下是否有意义。如果所有问题都是肯定的,那么你已经有了一个非常优化的结构 - 至少没有系统的完整视图。