错误处理器扩展点

描述

这个扩展点缩写为errhandler。

错误处理器,这个扩展点也很简单,通过register返回errhandler字段,这个字段要求格式是{http-code: error-view-func, other-code: other-error-view-func},键是标准的HTTP代码,值是错误处理函数,支持多个错误代码处理。

不过,现在新增一种格式:[{error=exception_class, handler=func}, {error=err_code,handler=func}],这种形式允许你使用http-code处理错误码,同时允许传入一个自定义的异常类和相关的处理器(捕获这个异常类的处理函数),请参考Flask文档编写这种基于类的形式的代码。

Flask-PluginKit通过 _error_handler() 加载errhandler,这个方法会检测errhandler规则及其内容。

需要注意的是,如果多个重复的错误处理函数,最终会被覆盖,仅一个有效。错误处理函数的编写可以参考官方文档是 flask-error-handlers

示例

  • 注册errhandler

from flask import jsonify

def permission_deny(error):
    return jsonify(dict(status=403, msg="permission deny")),403

class ApiError(Exception):

    def __init__(self, code, message, status_code=200):
        super(ApiError, self).__init__()
        self.code = code
        self.message = message
        self.status_code = status_code

    def to_dict(self):
        return dict(code=self.code, msg=self.message)

def handle_api_error(e):
    #: e is an instance of an exception class
    response = jsonify(e.to_dict())
    response.status_code = e.status_code
    return response

def raise_api_error_view():
    #: Actively triggering ApiError in the view will be intercepted by
    #: handle_api_error and return json response.
    raise ApiError(10000, "err_message")

def register():
    return {
        'vep': dict(rule='/api_error', view_func=raise_api_error_view),
        'errhandler': [
            dict(error=403, handler=permission_deny),
            dict(error=ApiError, handler=handle_api_error)
        ]
    }