【问题标题】:Have Pylons abort function send exception emails on errors让 Pylons 中止功能发送有关错误的异常电子邮件
【发布时间】: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函数吗?任何想法表示赞赏。

【问题讨论】:

    标签: exception error-handling pylons abort


    【解决方案1】:

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

    例如:

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

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

    1. 定义您自己的错误映射器(正确的方法)。查看http://wiki.pylonshq.com/display/pylonsdocs/Error+Documents 获取代码示例。
    2. 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。
      猜你喜欢
      • 2010-12-28
      • 2013-04-14
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 2021-09-22
      • 1970-01-01
      相关资源
      最近更新 更多