【问题标题】:How to use custom sys.excepthook in RootController in TurboGears 2.2.2如何在 TurboGears 2.2.2 的 RootController 中使用自定义 sys.excepthook
【发布时间】:2013-08-16 06:12:53
【问题描述】:

我希望在我的 TB 应用程序中将所有异常记录到日志文件中。因此,我尝试像往常一样使用自定义 sys.excepthook。但是仍然会引发每个异常并且没有记录任何内容。这是我的代码:

class RootController(BaseController):
    secc = SecureController()
    error = ErrorController()

    def __init__(self):
        self.installExceptHook()
        super(RootController, self).__init__()

    def installExceptHook(self):
        def exceptHook(type, value, tb):
            logger = logging.getLogger('app')
            logger.critical(''.join(traceback.format_exception(type, value, tb)))
        sys.excepthook = exceptHook

当我在 index 方法中引发 ValueError 时:

@expose('app.templates.index')
def index(self, **kwargs):
    raise ValueError
    return dict(page = 'index')

我的浏览器中仍然出现 WebError Traceback 页面,但没有任何记录。

你知道我做错了什么吗?有什么想法吗?

【问题讨论】:

    标签: python logging turbogears


    【解决方案1】:

    来自文档 (http://docs.python.org/2/library/sys.html#sys.excepthook):

    当异常被引发但未被捕获时,解释器调用 sys.excepthook [...] 在 Python 程序中,这发生在 程序退出。

    现在,由于 WebError 捕获异常并对其进行处理(您的应用程序甚至不会从此类异常中退出),因此异常不会到达调用 sys.excepthook 的地步。


    对于快速而肮脏的解决方案,您可以尝试在配置中设置 full_stack = False 以禁用 WebError 中间件 (https://github.com/TurboGears/tg2/blob/tg2.2.2/tg/configuration/app_config.py#L1036),这当然意味着您在网络服务器中处理故障响应代码。

    如果您只想记录异常但仍使用 WebError 调试/电子邮件功能,您可以设置一个自定义中间件,将其包裹在您的应用程序中,记录异常并将其传递。

    【讨论】:

    • 谢谢。我担心会有一些 TurboGears 中间件。
    • @nu.frix 在我寻找答案时,我总是发现挖掘 TG 源代码很有帮助!有时它们非常鼓舞人心:D
    • 我试了几次,但并不总是成功 :) 当我被“重定向”到第 5 个文件时,我放弃了 :D
    猜你喜欢
    • 2015-02-08
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多