让 Pylons 中止功能发送有关错误的异常电子邮件

Posted

技术标签:

【中文标题】让 Pylons 中止功能发送有关错误的异常电子邮件【英文标题】:Have Pylons abort function send exception emails on errors 【发布时间】:2011-07-04 03:16:51 【问题描述】:

我希望能够使用 pylons.controllers.util 中的 abort 函数来显示 404、500 个错误页面,其中包含有关问题的信息,但同时让 abort 函数从 errormiddleware 向我发送异常电子邮件。

现在,我有这个:

try:
    do(this)
except:
    abort(500, 'Something went wrong!')

这会显示一个带有 500 标题和我的消息的页面,这很好。但我想要的是让标准异常电子邮件发送给我,即使我自己返回了 500 错误。

有没有办法做到这一点?我可以从那里以某种方式运行errormiddleware函数吗?任何想法表示赞赏。

【问题讨论】:

【参考方案1】:

Pylons 已经通过配置 .ini 文件中的 error_email_from 和 email_to 参数向电子邮件报告了非常好的错误。

例如:

[DEFAULT]
email_to = errore@mysite.com
error_email_from = error_robot@mysite.com

更新: 有两种方法可以实现您想要实现的目标:

    定义您自己的错误映射器(正确的方法)。查看http://wiki.pylonshq.com/display/pylonsdocs/Error+Documents 获取代码示例。 以error.py 控制器的'document' 方法(快速但笨拙的方式)发送电子邮件。

【讨论】:

【参考方案2】:

在你的 middleware.py 你应该有这个:

if asbool(full_stack):
    # Handle Python exceptions
    app = ErrorHandler(app, global_conf, **config['pylons.errorware'])

    # Display error documents for 401, 403, 404 status codes (and
    # 500 when debug is disabled)
    if asbool(config['debug']):
        app = StatusCodeRedirect(app)
    else:
        app = StatusCodeRedirect(app, [400, 401, 403, 404, 500])

它会处理您的错误。但是,如果您想在发生错误时发送电子邮件,您可以编写在代码的关键部分调用的辅助函数,它将错误的详细信息发送到您的电子邮件,或者您可以重写此中间件 (ErrorHandler)。 ofc 你也可以在现有的 ErrorHandler 中添加那个辅助函数调用,但我不推荐它(修改现有的库不是好的编程)。

那个辅助函数的代码:

import turbomail
def send_mail(body, author,subject, to):
    conf = 
            'mail.on': True,
            'mail.transport': 'smtp',
            'mail.smtp.server': 'smtp.DOMAIN.SMT:25',
        

    turbomail.interface.start(conf)
    message = turbomail.Message(
            author = author,
            to = to,
            subject = subject,
            plain = body,
            encoding = "utf-8"
        )

    message.send()
    turbomail.interface.stop()

希望对你有帮助……

【讨论】:

我觉得这可能有点像 hack。我不想有另一种电子邮件发送机制,它可能会失败,并且看起来和运行不像默认的错误中间件。无论如何感谢您的回答:-)【参考方案3】:

手动引发异常,即 raise(SomeMeaningfulException) 怎么样?这应该由错误中间件自动处理。

【讨论】:

而 raise() 是来自哪个库的函数?我可以从 webob 库中执行“引发 HTTPBadRequest('Reason for error')”,但我认为这不会触发 errormiddleware。

以上是关于让 Pylons 中止功能发送有关错误的异常电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

一起搞懂PHP的错误和异常

支付处理 - pylons/python

Access 2016 定时发送自动电子邮件

我似乎无法让我的表格成功通过电子邮件发送

Django 1.3 日志记录:未记录 500 个错误

C# 为啥定时器会自动停止