如何使用Flask全局处理异常?我找到了使用以下方法来处理自定义数据库交互的方法:
casper.then(function(){
this.waitForText("To", function(){
this.click('button[title="Insert hyperlink"]');
});
this.wait(5000);
});
casper.then(function(){
this.waitForText("URL",function(){
this.sendKeys("input[role='textbox']","http://example.me");
});
this.wait(5000);
});
casper.then(function(){
this.waitForText("OK",function(){
this.clickLabel("OK");
});
this.wait(5000);
});
try:
sess.add(cat2)
sess.commit()
except sqlalchemy.exc.IntegrityError, exc:
reason = exc.message
if reason.endswith('is not unique'):
print "%s already exists" % exc.params[0]
sess.rollback()
- try
的问题是我必须在代码的每个方面运行它。我可以找到更好的方法来为自定义代码执行此操作。我的问题更倾向于全球捕捉和处理:
except
我发现此apimanager.create_api(
Model,
collection_name="models",
**base_writable_api_settings
)
接受apimanager
:[validation_exceptions
],但我发现没有使用此示例。
我仍然希望更高层次的处理能够影响所有数据库交互的简单概念“如果此错误:显示此错误,如果出现其他错误:显示其他内容”,它会自动在所有交互/异常上运行,而不包括我它在每ValidationError
{我把它放在我的apimanager
中就好了。 (base_writable_api_settings
,IntegrityError
,NameError
,DataError
等)
答案 0 :(得分:2)
我倾向于在应用程序上设置一个错误处理程序,将异常格式化为json响应。然后,您可以创建自定义异常,例如UnauthorizedException ...
class Unauthorized(Exception):
status_code = 401
@app.errorhandler(Exception)
def _(error):
trace = traceback.format_exc()
status_code = getattr(error, 'status_code', 400)
response_dict = dict(getattr(error, 'payload', None) or ())
response_dict['message'] = getattr(error, 'message', None)
response_dict['traceback'] = trace
response = jsonify(response_dict)
response.status_code = status_code
traceback.print_exc(file=sys.stdout)
return response
您还可以使用此模式处理特定的例外...
@app.errorhandler(ValidationError)
def handle_validation_error(error):
# Do something...
错误处理程序附加到应用程序,而不是apimanager。你可能有像
这样的东西app = Flask()
apimanager = ApiManager(app)
...
使用该app对象将其放在某处。
答案 1 :(得分:0)
我首选的方法是使用decorated视图函数。
你可以像下面那样定义装饰器:
def handle_exceptions(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except ValidationError:
# do something
except HTTPException:
# do something else ...
except MyCustomException:
# do a third thing
然后你可以简单地装饰你的视图功能,例如
@app.route('/')
@handle_exceptions
def index():
# ...
遗憾的是,我不知道Flask-Restless为传递视图函数提供的钩子。