How to catch socket timeout in Python 3?

淺唱寂寞╮ 提交于 2019-12-23 02:38:33

问题


Part of my script:

def testConnection(self):
    # This code doesn't work
    try:
        self.imap.login(self.user, self.password)
        return True
    except:
        return False

When I try to connect with imaplib to mail server with wrong settings, script always crashes with this error:

Traceback (most recent call last):
  File "./mail-notifier.py", line 198, in <module>
    mail_check()
  File "./mail-notifier.py", line 161, in mail_check
    if (SettingsExist() == True and Mail().testConnection() == True):
  File "./mail-notifier.py", line 142, in __init__
    self.imap = imaplib.IMAP4_SSL(settings.value("MailServer"), settings.value("Port"))
  File "/usr/lib64/python3.4/imaplib.py", line 1221, in __init__
    IMAP4.__init__(self, host, port)
  File "/usr/lib64/python3.4/imaplib.py", line 181, in __init__
    self.open(host, port)
  File "/usr/lib64/python3.4/imaplib.py", line 1234, in open
    IMAP4.open(self, host, port)
  File "/usr/lib64/python3.4/imaplib.py", line 257, in open
    self.sock = self._create_socket()
  File "/usr/lib64/python3.4/imaplib.py", line 1224, in _create_socket
    sock = IMAP4._create_socket(self)
  File "/usr/lib64/python3.4/imaplib.py", line 247, in _create_socket
    return socket.create_connection((self.host, self.port))
  File "/usr/lib64/python3.4/socket.py", line 512, in create_connection
    raise err
  File "/usr/lib64/python3.4/socket.py", line 503, in create_connection
    sock.connect(sa)
socket.timeout: timed out

I can't catch timeout exception and print error message and continue to work. I thought " except: " catches all errors that happen. I tried to set " except socket.timeout: " but unsuccessfully. What did I wrong?


回答1:


socket.connect(address)

Connect to a remote socket at address. (The format of address depends on the address family — see above.)

If the connection is interrupted by a signal, the method waits until the connection completes, or raise a socket.timeout on timeout, if the signal handler doesn’t raise an exception and the socket is blocking or has a timeout. For non-blocking sockets, the method raises an InterruptedError exception if the connection is interrupted by a signal (or the exception raised by the signal handler).

Changed in version 3.5: The method now waits until the connection completes instead of raising an InterruptedError exception if the connection is interrupted by a signal, the signal handler doesn’t raise an exception and the socket is blocking or has a timeout (see the PEP 475 for the rationale).

In case of remote connection you should check if the Internet connection can be established (you and remote destination are reachable) and connection setting to perform actions you want are correct.



来源:https://stackoverflow.com/questions/33442710/how-to-catch-socket-timeout-in-python-3

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!