处理烧瓶装饰器的错误

问题描述 投票:0回答:3

我有一个问题,与装饰器有关。例如,我编写了下一个装饰器,它处理错误,然后输出错误。

def handle_error(func):
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as err:
            print(err)
    return wrapper


@handle_error
def raise_error():
    return 1 / 0

raise_error()

但是,如果我想对 Flask 做同样的事情,这是行不通的。

@app.route('/')
@handle_error
def index():
    return {'hello'}

if __name__ == '__main__':
    app.run()

所以我猜测,是在 route 装饰器中引发的错误,对吗?如果是,我有问题:从技术上讲,我可以编写一个装饰器来处理 route 装饰器的所有异常?

python flask error-handling python-decorators
3个回答
3
投票

你可以创建一个类似这样的错误处理程序,就像我在我的装饰器中所做的那样

def error_handler() -> object:
    def wrapper(f):
        @wraps(f)
        def wrapped(*args, **kwargs):
            try:
                return f(*args, **kwargs)
            # handle different types of errors and return messages accordingly with status code
            except Exception as e:
                if isinstance(e, ValueError):
                    return jsonify({'message': e.args[0], 'type': 'ValueError'}), 400
                elif isinstance(e, AttributeError):
                    return jsonify({'message': e.args[0], 'type': 'AttributeError'}), 400
                elif isinstance(e, KeyError):
                    return jsonify({'message': e.args[0], 'type': 'KeyError'}), 400
                elif isinstance(e, TypeError):
                    return jsonify({'message': e.args[0], 'type': 'TypeError'}), 400
                else:
                    return jsonify({'message': str(e), 'type': 'InternalServerError'}), 500
        return wrapped
    return wrapper

如果您希望将这些错误记录在文件中,您可以在我们初始化 Flask 应用程序的位置导入并设置日志记录。日志消息以及来自 except 块的错误。


0
投票

您可以将错误处理程序与记录器一起使用。

logger = app.logger()

@app.errorhandler(500)
def somehandler(e):
    logger.critical(e.description) # this is level of logger

所以当发生 500 错误时,记录器将工作。 你也可以犯自己的错误。

如何为 Flask 中的所有 HTTP 错误实现自定义错误处理程序?


0
投票

Flask 已经有了

errorhandler()
装饰器,在这里查看快速介绍

您不会使用它来装饰您的视图函数,而是使用它来装饰您想要的错误处理函数。

以您的示例代码为例,使用此装饰器可能看起来像这样:

@app.route('/')
def index():
    return {'hello'}

@app.route('/dividebyzero')
def divbyzero():
    return 1 / 0

@app.errorhandler(404):
def handle_notfound(e):
    return 'we could not find the page'

@app.errorhandler(500):
def handle_intsrverr(e):
    return 'we stumbled upon some exception'

if __name__ == '__main__':
    app.run()
© www.soinside.com 2019 - 2024. All rights reserved.