Flask和sys.excepthook

时间:2014-02-07 12:09:22

标签: python exception-handling flask

我想将全局异常处理对象添加到Flask webproject中。在主模块中,创建应用程序类的地方我添加了代码来覆盖sys.excepthook。这是简单的测试代码:

import sys

def my_exception_hook(exception_type, value, traceback):
    print "My exception handler"
    print "  Exception type:", exception_type
    print "  Exception instance:", value
    print "  Traceback:", traceback

    sys.__excepthook__(exception_type, value, traceback)

sys.excepthook = my_exception_hook

from flask import Flask
import requests

app = Flask(__name__)

@app.route('/')
def index():
    #Exception raised here "requests.exceptions.MissingSchema" not captured by my handler
    r = requests.get('ololo', auth=('user', 'pass'))
    return "Hello, world!"

#raise Exception("AAA") #Exception raised here is successfully goes to my_exception_hook

app.run(debug=True, port=5001)

我不希望也不可能用requests包围每个电话或try/catch模块。另外我想处理其他的eaception,例如,mongoDB连接问题可能会自发发生(不是我创建连接),请不要建议。

1 个答案:

答案 0 :(得分:4)

Flask已经为您处理了视图中的异常。使用sys.excepthook而不是处理此问题的正确方法,永远不会调用挂钩。

使用Flask指定自定义异常处理程序,请参阅快速入门手册的Redirects and Errors section

from flask import render_template

@app.errorhandler(500)
def page_not_found(error):
    return 'some error message'

Flask还使用logging module来记录异常;配置日志记录模块以将严重性logging.ERROR的任何内容写入控制台或日志文件。

由于您使用app.run(debug=True, port=5001),因此您已经看到打印到控制台的例外情况。

请注意,只有在调试设置为True时才会调用500错误页面;否则会调用Werkzeug debug view