How to catch socket timeout in Python 3?

2019-06-03 01:02发布

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条回答
啃猪蹄的小仙女
2楼-- · 2019-06-03 01:52

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.

查看更多
登录 后发表回答