2015-10-30 3 views
1

Часть моего сценария:Как уловить тайм-аут сокета в Python 3?

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

Когда я пытаюсь соединиться с imaplib к почтовому серверу с неправильными настройками, сценарий всегда падает с этой ошибкой:

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 

Я не могу поймать исключение тайм-аута и напечатать сообщение об ошибке и продолжить работу. Я думал, что «кроме:» ловит все ошибки, которые происходят. Я попытался установить «except socket.timeout:», но безуспешно. Что я не так?

+0

Проблема заключается в установлении соединения, но не в тайм-ауте соединения. – hrust

+0

Как поймать эту ошибку? – Rinaldus

+0

Попробуйте поймать ошибку там, где вы звоните: 'mail_check()' – hrust

ответ

0

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).

В случае удаленного подключения вы должны проверить, если подключение к Интернету может быть установлено (вы и удаленный адрес назначения достижимы) и настройки соединения для выполнения действий, которые вы хотите правильно.