フラスコの例外処理:中止、ErrorHandlerを、app_errorhandler、カプセルグローバル例外ハンドラ

1.アボート()

アボート()関数も事前を終了し、指定されたエラーコードを返すように要求、ビュー機能が終了すると呼ばれています。それが終了関数の図であるため、すなわち、アボート()関数は、ビューに書き込まれます。URLが正当でないと、ビュー関数に入ることができないため、この関数は、原因URLが違法な原因となった例外を処理することはできません。

フラスコ安らか()コードでは、フラスコアボート()コードでカプセル化されアボート。

フラスコ・アボート()出典:

def abort(status, *args, **kwargs):
    return _aborter(status, *args, **kwargs)

フラスコ-安らかアボート()出典:

def abort(http_status_code, **kwargs):
    try:
        original_flask_abort(http_status_code)
    except HTTPException as e:
        if len(kwargs):
            e.data = kwargs
        raise

ここ)アボートのフラスコ(である)(original_flask_abort。実際には、我々は我々が必要とする機能を実現するためにアボート()関数をカプセル化するために所有することができます。

1.1を使用してください:エラーコードを送信

from flask import abort

@app.route("/")
def index():
    # abort函数可以提前终止视图函数
    abort(404)

    # 下面这条消息无法打印出来,因为上面abort函数已经终止了这个视图函数的运行。
    print("我还在运行ing")
    return "Index Page"

パラメータはHTTP_STATUS_CODE:配達ステータスコード(エラーコード)は、標準のHTTPステータスコードでなければなりません。

エラーコードに対応するエラーメッセージのフロントページに直接戻されます。

エラーコードを確認します。

from werkzeug.exceptions import default_exceptions
import pprint

pprint.pprint(default_exceptions)

結果:

その場合、内部サーバーエラーが以下のリスト外で報告されます:{「メッセージ」:「内部サーバーエラー」}
の2xxと3xxのは、このリストに含まれていない見ることができます。


{400: <class 'werkzeug.exceptions.BadRequest'>,
 401: <class 'werkzeug.exceptions.Unauthorized'>,
 403: <class 'werkzeug.exceptions.Forbidden'>,
 404: <class 'werkzeug.exceptions.NotFound'>,
 405: <class 'werkzeug.exceptions.MethodNotAllowed'>,
 406: <class 'werkzeug.exceptions.NotAcceptable'>,
 408: <class 'werkzeug.exceptions.RequestTimeout'>,
 409: <class 'werkzeug.exceptions.Conflict'>,
 410: <class 'werkzeug.exceptions.Gone'>,
 411: <class 'werkzeug.exceptions.LengthRequired'>,
 412: <class 'werkzeug.exceptions.PreconditionFailed'>,
 413: <class 'werkzeug.exceptions.RequestEntityTooLarge'>,
 414: <class 'werkzeug.exceptions.RequestURITooLarge'>,
 415: <class 'werkzeug.exceptions.UnsupportedMediaType'>,
 416: <class 'werkzeug.exceptions.RequestedRangeNotSatisfiable'>,
 417: <class 'werkzeug.exceptions.ExpectationFailed'>,
 418: <class 'werkzeug.exceptions.ImATeapot'>,
 422: <class 'werkzeug.exceptions.UnprocessableEntity'>,
 423: <class 'werkzeug.exceptions.Locked'>,
 428: <class 'werkzeug.exceptions.PreconditionRequired'>,
 429: <class 'werkzeug.exceptions.TooManyRequests'>,
 431: <class 'werkzeug.exceptions.RequestHeaderFieldsTooLarge'>,
 451: <class 'werkzeug.exceptions.UnavailableForLegalReasons'>,
 500: <class 'werkzeug.exceptions.InternalServerError'>,
 501: <class 'werkzeug.exceptions.NotImplemented'>,
 502: <class 'werkzeug.exceptions.BadGateway'>,
 503: <class 'werkzeug.exceptions.ServiceUnavailable'>,
 504: <class 'werkzeug.exceptions.GatewayTimeout'>,
 505: <class 'werkzeug.exceptions.HTTPVersionNotSupported'>}

1.2第二の方法:書式文字列のJSONを渡します

from flask import abort, jsonify

@app.route("/")
def index():
    code = 50000
    data = [{"data1": "lalallala", {"data2": "lolololo"}]
    json_data = jsonify({"code": code, "data": data})
    abort(json_data)

    # 下面这条消息无法打印出来,因为上面abort函数已经终止了这个视图函数的运行。
    print("我还在运行ing")
    return "Index Page"

この方法は、リターンデータはアボートのフロントエンドに直接渡され、リターンに相当します。

3 1.3を使用してください:レスポンスボディを送信

from flask import abort, Response

@app.route("/")
def index():
    res = Response("Not Found", 404, {"name": "ttytty"})  # Response也可以返回响应体信息
    abort(res)

    # 下面这条消息无法打印出来,因为上面abort函数已经终止了这个视图函数的运行。
    print("我还在运行ing")
    return "Index Page"

直接バック前端に応じ。第二の方法と3つの方法非常に似て。

2.のErrorHandler

アプリ青写真または現在のステータスコードをキャプチャし、処理をカスタマイズすることができます。

2.1は、単純な使用します。

from flask import jsonify
from . import admin

@admin.errorhandler(404)
def error_404(error):
    """这个handler可以catch住所有abort(404)以及找不到对应router的处理请求"""
    response = dict(status=0, message="404 Not Found")
    return jsonify(response), 404

@admin.errorhandler(Exception)
def error_500(error):
    """这个handler可以catch住所有的abort(500)和raise exeception."""
    response = dict(status=0, message="500 Error")
    return jsonify(response), 400

class MyError(Exception):
    """自定义错误类"""
    pass

@admin.errorhandler(MyError)
def MyErrorHandle(error):
    response = dict(status=0, message="400 Error")
    return jsonify(response), 400

グローバル例外トラップハンドラにパッケージ化2.2:

  1. カスタム例外クラス(必要な場合)

from werkzeug.exceptions import HTTPException


class EigenException(HTTPException):
    code = 500
    eigen_code = 4000
    description = 'Inner Server Error'


class RequestError(EigenException):
    code = 400


class DataNotFound(RequestError):
    code = 404
    eigen_code = 4004
    description = 'Data Not Found'

    def __init__(self, message):
        self.description = '%s Not Found' % message


class InvalidRequest(RequestError):
    eigen_code = 4005
    description = 'Invalid Request URL'


class MissingKey(RequestError):
    eigen_code = 4006
    description = 'Missing Key'

    def __init__(self, key):
        self.description = 'Missing Key `%s`' % key
  1. キャッチと取り扱い:

# 制定一个响应
def json_response(code, error, status_code):
    response = make_response(json.dumps(dict(code=code, error=error)), status_code)
    response.headers['Content-Type'] = 'application/json; charset=utf-8'
    return response

# 异常捕获处理
@app.errorhandler(Exception)
def handler_exception(e):
    if isinstance(e, 其他异常):
        code, status_code, error = 4000, 400, e.description
    elif isinstance(e, EigenException):
        code, status_code, error = e.eigen_code, e.code, e.description
    elif isinstance(e, HTTPException):
        code, status_code, error = e.code, e.code, e.description
    else:
        code, status_code, error = 5000, 500, '%s(%s)' % (e.__class__.__name__, str(e))
    return json_response(code, error, status_code)

3. app_errorhandler

グローバル状態コード、およびカスタム例外処理をキャプチャ

少し異なるエラーハンドラの青写真の準備では、ErrorHandlerのデコレータ場合は、エラーの唯一の青写真がトリガされます。あなたはグローバルエラーハンドラを登録したい場合は、app_errorhandlerを使用しています。

例えば:


from bookapp import bokkapp


@bookapp.app_errorhandler(Exception)
def handler_exception(e):
    if isinstance(e, 其他异常):
        code, status_code, error = 4000, 400, e.description
    elif isinstance(e, EigenException):
        code, status_code, error = e.eigen_code, e.code, e.description
    elif isinstance(e, HTTPException):
        code, status_code, error = e.code, e.code, e.description
    else:
        code, status_code, error = 5000, 500, '%s(%s)' % (e.__class__.__name__, str(e))
    response = dict(code=code, status=status_code, msg=error)
    return jsonify(response)

注意:私たちは、グローバルな状態401をキャプチャするために、アプリ、app.errorhandler(401)を作成するために、工場出荷時のパターンを使用していないときに、アプリはcreate_appの方法を使用して作成された場合は、キャプチャすることはできません、あなたがキャプチャしたい場合、あなたは青写真で書くことができ、 admin.errorhandler(401)、すなわち、すべての管理青写真、admin.app_errorhandler(401)を捕捉するステータス・コード401、グローバル状態コード401を捕捉することである、すなわち、状態401の他の設計図は、それが処理され、捕捉され

参考記事:

  1. https://www.cnblogs.com/huchong/p/9205651.html
  2. https://www.cnblogs.com/fiona-zhong/p/10218338.html

おすすめ

転載: www.cnblogs.com/ChangAn223/p/11323524.html