Flask全局异常处理

时间:2016-07-29 15:55:29

标签: flask

如何使用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_settingsIntegrityErrorNameErrorDataError等)

2 个答案:

答案 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为传递视图函数提供的钩子。