Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flask 烧瓶全局异常处理_Flask - Fatal编程技术网

Flask 烧瓶全局异常处理

Flask 烧瓶全局异常处理,flask,Flask,如何使用Flask全局处理异常?我找到了使用以下方法处理自定义db交互的方法: 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] s

如何使用Flask全局处理异常?我找到了使用以下方法处理自定义db交互的方法:

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

apimanager.create_api(
    Model,
    collection_name="models",
    **base_writable_api_settings
)
我发现这个
apimager
接受
validation\u异常
:[
ValidationError
]但是我没有发现使用过这样的例子


我仍然希望使用一个简单的概念“如果此错误:显示此错误,如果另一个错误:显示其他错误”,来实现影响所有db交互的更高级别的处理,该概念仅在所有交互/异常上自动运行,而无需我将其包含在每个
apimager
(我想把它放在我的
base\u writable\u api\u设置中可以了)。(
IntegrityError
namererror
DataError
DatabaseError
,等等)

我倾向于在应用程序上设置一个错误处理程序,将异常格式化为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) 
...

使用该应用程序对象将其放置在某个位置。

我首选的方法是使用视图函数

您可以定义如下所示的装饰器:

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():
  # ...

不幸的是,我不知道为传递视图函数而提供的hooks\n服务。

是相关文档!您能告诉我如何将其连接到:apimager.create\u api(Model,collection\u name=“models”,**base\u writable\u api\u settings)目前,我的目标是获取适用于所有api_管理器的IntegrityError自定义消息。
code base_api_设置={“排除_列”:['password'、'user.password'、'groups'、'registration_token'、'user.registration_token']、“每个页面的最大结果数”:100,“验证_异常”:[ValidationError]}
我尝试了几种不同的方法。每次我提交一个重复的条目,我都会得到标准:{“message”:“IntegrityError”}这是一个粘贴箱:谢谢你的帮助。这是我的框架lol中一个非常烦人的添加。