对待尝试,除了相同

时间:2017-12-07 10:17:57

标签: python sockets

我正在写一些东西来检查端口是否打开,但是将其修改为我的使用。

我为检查设置了超时,如果超时达到它会引发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有更聪明的东西。

什么能实现这个目标?

1 个答案:

答案 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()在这种情况下是否有意义。如果所有问题都是肯定的,那么你已经有了一个非常优化的结构 - 至少没有系统的完整视图。