我想将全局异常处理对象添加到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连接问题可能会自发发生(不是我创建连接),请不要建议。
答案 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。