首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >烧瓶全局异常处理

烧瓶全局异常处理
EN

Stack Overflow用户
提问于 2016-07-29 15:55:29
回答 2查看 2.9K关注 0票数 3

如何才能在全球范围内处理瓶中的异常?我找到了使用以下方法处理自定义db交互的方法:

代码语言:javascript
复制
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的问题是,我必须在代码的每个方面运行它。我可以为定制代码找到更好的方法。我的问题更多地是针对以下方面的全球捕获和处理:

代码语言:javascript
复制
apimanager.create_api(
    Model,
    collection_name="models",
    **base_writable_api_settings
)

我发现这个apimanager接受validation_exceptionsValidationError,但是我没有找到使用它的例子。

我仍然想要一个更高层次的处理,用一个简单的概念“如果这个错误:显示这个,如果另一个错误:显示其他什么”来处理影响所有db交互的更高层次,它只在所有交互/异常上自动运行,而不包括在每个apimanager上(我想把它放在我的base_writable_api_settings中很好)。(IntegrityErrorNameErrorDataErrorDatabaseError等)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-29 16:11:53

我倾向于在应用程序上设置一个错误处理程序,将异常格式化为json响应。然后您可以创建像UnauthorizedException这样的自定义异常..。

代码语言:javascript
复制
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

您还可以使用此模式处理特定的异常..。

代码语言:javascript
复制
@app.errorhandler(ValidationError)
def handle_validation_error(error):
    # Do something...

错误处理程序被附加到应用程序,而不是apimanager。你可能有这样的东西

代码语言:javascript
复制
app = Flask()
apimanager = ApiManager(app) 
...

用那个应用程序对象把这个放到某个地方。

票数 2
EN

Stack Overflow用户

发布于 2016-07-29 16:12:15

我最喜欢的方法是使用装饰过的视图函数。

您可以定义一个装饰师,如下所示:

代码语言:javascript
复制
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

然后,您可以简单地装饰您的视图-功能,例如。

代码语言:javascript
复制
@app.route('/')
@handle_exceptions
def index():
  # ...

不幸的是,我不知道钩子,水瓶-无休止的提供传递视图-功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38662960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档