4

我希望在我的 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 页面,并且没有记录任何内容。

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

4

1 回答 1

2

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

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

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


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

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

于 2013-08-15T07:31:14.927 回答