簡體   English   中英

如何使用上下文管理器例外

[英]How to use context manager with exceptions

我需要從電子郵件中讀取文件附件。 我想使用上下文管理器進行資源管理(連接應該關閉)

@contextmanager
def some_f():
    conn = None
    try:
        for _ in xrange(CONNECTION_ERRORS_MAX):
            try:
                conn = POP3(self.pop3_host)
                conn.user(self.pop3_user)
                conn.pass_(self.pop3_password)
                logger.debug('connected {}', conn.getwelcome())
                _, msg_ids, _ = conn.uidl()
                yield (
                    (msg_id, self.files_from_msg(conn, file_batch_id, msg_id))
                    for msg_id, file_batch_id in
                    (ul.split(' ') for ul in msg_ids)
                    if not self.is_ignored(file_batch_id, msg_id)
                )
            except socket.error as e:
                if e.errno == errno.ECONNREFUSED:
                    pass
                else:
                    raise e
    finally:
        if conn:
            conn.quit()

因此,此功能應該執行的操作是嘗試連接到電子郵件服務器,如果發生另一個套接字錯誤,則如果拒絕連接,則重試n次,然后重新發送。 如果重試嘗試已用盡,則重新引發連接拒絕錯誤。 使用者使用完所有文件后將關閉連接。 現在,它使生成器沒有產生錯誤。

重組try-except子句,使它包圍最少的事物。 在except子句中,必要時可以continue ,如果未觸發,則應從for循環中break

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM