Flask 默认错误处理程序未被调用

11

我有一个 errors.py 模块,用于将错误映射到模板。我想添加一个默认的错误处理程序,并找到了这个链接:http://flask.pocoo.org/mailinglist/archive/2012/7/12/default-error-handler/#cbeb8809dc0da7133f14b99e16f31d6b

我正在使用 Blueprint 进行模块化,而错误模块具有以下映射:

@err.app_errorhandler(403)
def forbidden(e):
   return render_template('403.html'), 403

@err.app_errorhandler(500)
def serverError(e):
   return render_template('500.html'), 500

@err.app_errorhandler(Exception)
def defaultHandler(e):
   return render_template('defaultError.html'), e.code

如果我中断到特定映射(403、500),那么它们可以正常工作(或自然产生),但如果我中断到其他任何东西(404等),则不会调用defaulHandler()

3个回答

12

您可以这样做:

app.config['TRAP_HTTP_EXCEPTIONS']=True
app.register_error_handler(Exception, defaultHandler)

2
似乎flask代码中的404并不会引发异常,因此默认处理程序没有任何被触发的原因。如果我在我的URL映射中添加“raise Exception”,然后导航到该页面,就可以使其被触发。
当然,如果您有500错误映射,异常将变成服务器端错误,并且因此会落入该捕获区域,因此我现在无法看到捕获异常的用途(我无法想到任何情况下它会捕获500个“errorhandler”无法捕获的内容)。

1

检查render_template('defaultError.html')e.code是否引发任何异常。例如,我不确定你的任何异常是否都有code属性,请尝试非常简单的示例:

@err.app_errorhandler(Exception)
def defaultHandler(e):
   return 'error handler there', 500

没有任何异常被触发(使用 Flask 内置服务器运行)。如果有的话,我本以为我的 500 映射会被触发。 - bqui56
对我来说,它很好用,flask==0.10.1wergzeug=0.9.4。关于用户异常,请查看您的代码为什么没有处理 https://github.com/mitsuhiko/flask/blob/master/flask/app.py#L1475。 - tbicr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接