如何在TurboGears 2.2.2中的RootController中使用自定义sys.excepthook

时间:2013-08-14 10:26:56

标签: python logging turbogears

我想在我的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

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

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

我仍然在浏览器中获取WebError Traceback页面,并且没有记录任何内容。

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

1 个答案:

答案 0 :(得分:2)

来自文档(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),这当然意味着您在Web服务器中处理失败响应代码。 / p>

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