Python - 异常升级时发送电子邮件?

use*_*424 15 python exception-handling

我有一个python有很多方法的类():

Method1()

Method2()

...........

...........

MethodN()

所有方法 - 在执行不同任务时 - 具有相同的方案:

do something
do something else
has anything gone wrong?
    raise an exception
Run Code Online (Sandbox Code Playgroud)

我想能够在课堂上的任何地方引发异常时收到电子邮件.

有没有简单的方法将这个逻辑组合到类中,而不是SendEmail()在每个raise Exception语句之前调用?什么是正确的,pythonic方式处理这种情况?canh''generalized'异常处理程序是解决方案吗?我很高兴你有任何想法.

小智 63

就像@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')
Run Code Online (Sandbox Code Playgroud)

问候.

  • 我认为这是最好的答案,但我会将最后一行更改为:logger.exception('Unhandled Exception') (7认同)

Use*_*ser 8

Python stdlib有专门的类来做你想要的.看到logging.handlers.SMTPHandler


sen*_*rle 7

注意:虽然这是一个简单明了的解决方案,但在大多数情况下,下面的答案可能更好.

如果替代方案是这样的:

if problem_test():
    SendEmail()
    raise Exception
Run Code Online (Sandbox Code Playgroud)

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

def raise_email(self, e):
    SendEmail()
    raise e
Run Code Online (Sandbox Code Playgroud)


gun*_*sus 6

要点链接

\n\n

最重要的技巧是,如果未传递安全参数,默认值为None,如果您尝试使用TLS/SSL启用的 STMP 服务器(例如 Gmail、Yahoo、Yandex、STMP 服务器)进行身份验证,则会引发异常。

\n\n

我们传递了一个空元组来触发smtp.ehlo()以使用 SSL 进行正确身份验证。

\n\n
...\nif self.secure is not None:\n    smtp.ehlo()\n    smtp.starttls(*self.secure)\n    smtp.ehlo()\n...\n\n\nimport logging\nimport logging.handlers\n\n__author__ = \'Ahmed \xc5\x9eeref G\xc3\x9cNEYSU\'\n\n\ndef foo():\n    raise Exception("Foo Bar")\n\n\ndef main():\n    logger = logging.getLogger()\n    logger.addHandler(logging.handlers.SMTPHandler(\n        mailhost=("smtp.mail.yahoo.com", 587),\n        fromaddr="boss@example.com",\n        toaddrs="me@example.com",\n        subject="EXCEPTION",\n        credentials=(\'smtpuser@example.com\', \'MY SECRET PASSWORD\'),\n        secure=()))\n    try:\n        foo()\n    except Exception, e:\n        logging.exception(e)\n\n\nif __name__ == \'__main__\':\n    main()\n
Run Code Online (Sandbox Code Playgroud)\n


Mic*_*lon 5

小心巫师的学徒!

最好记录这些错误,然后检查最后一封电子邮件的发送时间,如果时间跨度太短,请不要发送另一条消息,因为人类已经在查看日志文件.对于很多事情来说,每天只发一条消息就足够了,但即使对于系统关键的事情,如果你已经有一次失败,如果你等了两个小时发送下一封电子邮件,会出现什么问题呢?

如果您每两小时发送一封电子邮件,那么每天最多的电子邮件数量为12.如果您遇到级联故障(您将会!),那么很可能会在第一次失败事件发生后的几个小时内发生.

大多数大型网络公司提供4小时的SLA来修复故障,从最初发生故障开始计算(因为级联故障往往会重复),直到客户满意为止.如果您的SLA比SLA更严格,那么除非是某些金融行业服务,否则您可能提供的服务水平过高.

但是如果你确实有4小时的SLA,那么我会确保在最后一封电子邮件的2到4小时内发送的任何电子邮件应该使用你可以使用的任何铃声和口哨来确定它的优先顺序,突出显示它等.例如使用X-Priority标题并在主题中放置单词URGENT,以便您的邮件客户端可以用大的粗体红色字母显示它.