针对"flask中主动抛出异常及统一异常处理",下面是完整的攻略:
异常处理的原理
在Flask程序中,异常处理是围绕着 Flask 的 Exception
类型展开的。我们可以通过创建自己的异常类,以及编写对应的异常处理装饰器来实现自己的异常捕捉和处理。
Flask提供了两个主要的装饰器,用于异常处理:
@app.errorhandler()
- 用于全局和局部异常处理@app.exception()
- 用于全局异常处理
其中@app.errorhandler()
用于捕捉指定类型的错误,并进行局部或全局的异常处理。当指定的异常发生时,该装饰器封装的函数将被调用,并处理异常。一般用于局部异常处理。比如下面的示例:
from flask import Flask, jsonify
app = Flask(__name__)
@app.errorhandler(404)
def page_not_found(e):
return jsonify({"message": "Page not found."}), 404
if __name__ == '__main__':
app.run(debug=True)
上述代码指定了404错误的处理,当访问的URL不存在,将会返回404错误页面,而不是默认的HTML错误页面。
@app.exception()
则会捕捉全局错误或异常,并在全局范围内进行处理。它比@app.errorhandler()
更加强大。例如:
from flask import Flask
app = Flask(__name__)
@app.exception(Exception)
def handle_exception(e):
return 'Unexpected error occurred', 500
if __name__ == '__main__':
app.run(debug=True)
上面的代码中,@app.exception(Exception)
指明了捕捉 Exception
类型的错误,如:ValueError 或 AttributeError。而当异常发生时,会返回'Unexpected error occurred'。
Flask中主动抛出异常的方法
在Flask中我们可以使用abort()
函数主动抛出异常。当有异常发生的时候,返回包含特定状态代码和信息的HTML页面。一般情况下,我们常常将状态代码设置为404
, 401
, 403
, 500
等常见HTTP状态码。
下面是一个使用abort()
主动抛出异常的示例代码:
from flask import Flask, abort
app = Flask(__name__)
@app.route('/user/<string:user_id>')
def get_user_data(user_id):
if not user_id:
# use abort to send a 404 error
abort(404)
else:
# return the user data
return f"Get data for user with id {user_id}"
if __name__ == '__main__':
app.run(debug=True)
上面的代码中,/users/
URL 会接收一个用户的ID号码,如果用户未提供ID会使用 abort(404)
函数返回一个状态码为404的页面,提示用户该页面不存在。相反,如果用户提供了ID,程序会返回该ID对应的用户数据。当定义 abort()
函数时,可以为其指定一个自定义的错误信息。
Flask中的统一异常处理
Flask中提供了一个@app.errorhandler()
装饰器,用于在整个应用程序中捕捉指定类型的异常,从而实现全局异常处理。而如果想要实现固定的错误信息或格式,可以创建一个基本异常类,并从该类中继承其他异常类。
下面是一个使用@app.errorhandler()
装饰器实现全局异常处理的示例代码:
from flask import Flask, jsonify
app = Flask(__name__)
class BadRequest(Exception):
pass
@app.errorhandler(BadRequest)
def handle_bad_request(e):
response = jsonify({'message': 'bad request'})
response.status_code = 400
return response
if __name__ == '__main__':
app.run(debug=True)
上面的代码中,我们先定义了一个名为BadRequest的异常类,然后使用 @app.errorhandler()
装饰器指定Exception的目标,指定一个异常处理函数,当捕捉到指定异常时,执行给定的操作。在本例中,当捕捉到名为BadRequest的异常时,会发出第400状态码的错误响应,并返回“bad request”错误信息。
另一个示例是使用自定义@app.exception()
装饰器捕捉捕获所有异常,达到全局处理的目的。如下所示:
from flask import Flask, jsonify
app = Flask(__name__)
@app.exception(Exception)
def handle_exception(e):
response = jsonify({'error': str(e)})
response.status_code = 500
return response
if __name__ == '__main__':
app.run(debug=True)
这个例子中,我们使用@app.exception(Exception)
捕获所有异常,并通过json格式返回异常信息,返回第500状态码的错误响应。
这些是Flask中处理异常的方法,希望能对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:flask中主动抛出异常及统一异常处理代码示例 - Python技术站