Python -- 异常抛出时发送邮件?

24 投票
12 回答
45116 浏览
提问于 2025-04-16 18:39

我有一个 python 类,这个类里面有很多方法:

Method1()

Method2()

...........

...........

MethodN()

这些方法虽然执行的任务不同,但它们的结构是一样的:

do something
do something else
has anything gone wrong?
    raise an exception

我希望每当这个类里面发生错误时,都能收到一封邮件。

有没有什么简单的方法可以把这个逻辑放到类里面,而不是在每个 raise Exception 语句之前都调用一次 SendEmail() 呢?处理这种情况的正确、符合 Python 风格的方法是什么?一个“通用”的异常处理器能解决这个问题吗?如果你有任何想法,我会很感激。

12 个回答

8

Python的标准库里有一个专门的类可以帮你完成你想做的事情。你可以看看 logging.handlers.SMTPHandler

81

就像@User之前说的,Python有一个叫做 logging.handlers.SMTPHandler 的工具,可以用来发送记录的错误信息。建议使用这个日志模块!重写异常类来发送邮件并不是个好主意。

这里有个简单的例子:

import logging
import logging.handlers

smtp_handler = logging.handlers.SMTPHandler(mailhost=("smtp.example.com", 25),
                                            fromaddr="from@example.com", 
                                            toaddrs="to@example.com",
                                            subject=u"AppName error!")


logger = logging.getLogger()
logger.addHandler(smtp_handler)

try:
  break
except Exception as e:
  logger.exception('Unhandled Exception')
9

注意:虽然这个解决方案看起来简单明了,但下面的回答在大多数情况下可能更好。

如果替代方案是这样的:

if problem_test():
    SendEmail()
    raise Exception

那你为什么不直接定义一个自定义的 raise_email 方法呢?

def raise_email(self, e):
    SendEmail()
    raise e

撰写回答