コンテンツにスキップ

例外

Starletteを使用すると、カスタム例外ハンドラをインストールして、エラーまたは処理された例外が発生した場合に応答を返す方法を処理できます。

Starlette. applicationからStarletteをインポート
starletteからHTTPExceptionをインポートします。
インポートリクエスト
starletteからHTMLResponseをインポート


HTML_404_PAGE=.。。
HTML_500_PAGE=.。。


async def not_found(request: Request,exc:HTTPException):
    return HTMLResponse(content=HTML_404_PAGE, status_code=exc.status_code)

async def server_error(request: Request,exc:HTTPException):
    return HTMLResponse(content=HTML_500_PAGE, status_code=exc.status_code)


例外ハンドラー={
    404: not_found,
    500:サーバーエラー
}

app=Starlette(ルート=ルート、例外ハンドラー=例外ハンドラー)

debug が有効でエラーが発生した場合、Starletteはインストールされている500ハンドラーではなく、バックトラック応答を使用します。

app=Starlette(デバッグ=True、ルート=ルート、例外ハンドラー=例外ハンドラー)

特定のステータスコードのハンドラを登録するだけでなく、例外クラスのハンドラも登録できます。

特に、組み込みの HTTPException クラスの処理を上書きしたい場合があります。例えば、JSONスタイルのレスポンスを使用する場合:

async def http_Exception(request: Request,exc:HTTPException):
    return JSONResponse({"detail": exc.detail}, status_code=exc.status_code)

例外ハンドラー={
    HTTP例外
}

HTTPException は headers パラメータも備えています。これにより、ヘッダーをレスポンスクラスに伝播することができます。

async def http_Exception(request: Request,exc:HTTPException):
    return JSONResponse(JSONResponse)
        {"detail": exc.detail},
        ステータスコード=exc. status_code,
        ヘッダー=exc. header
    )

WebSocketException の処理を上書きすることもできます。

async def websocket_例外(websocket: WebSocket,exc:WebSocketException):
    websocket. closeを待つ(コード=1008)

例外ハンドラー={
    WebSocketException:ウェブソケット例外
}

エラーと処理された例外

処理された例外とエラーを区別することが重要です。

処理された例外は、エラー状態を表すものではありません。それらは強制的に適切なHTTP応答に変換され、標準のミドルウェアスタックを介して送信されます。デフォルトでは、処理された例外は HTTPException クラスを使用して管理されます。

エラーは、アプリケーション内で発生するその他の例外です。これらの状況は、ミドルウェアスタック全体で例外としてバブリングする必要があります。エラーログミドルウェアは、例外がサーバーに至るまで確実に再スローされるようにする必要があります。

実際には、使用されるエラー処理は exception_handler[500] または exception_handler[Exception] です。500 と Exception の両方のキーを使用できます。以下を参照してください。

async def hand le_error(request: Request,exc:HTTPException):
    #ロジックを実行する
    return JSONResponse({"detail": exc.detail}, status_code=exc.status_code)

例外ハンドラー={
    例外: hand le_error#または"500:hand le_error"
}

注意点としては、BackgroundTask が例外を発生させた場合、handle_error 関数で処理されますが、この時点で既にレスポンスが送信されています。つまり、handle_error が作成したレスポンスは破棄されます。 レスポンスが送信される前にエラーが発生した場合、レスポンスオブジェクト(上記の例では返された JSONResponse)が使用されます。

この動作を適切に処理するために、Starlette アプリケーションのミドルウェアスタックは次のように構成されています。

  • ServerErrorMiddleware -サーバーでエラーが発生したときに500の応答を返します。
  • インストールされているミドルウェア
  • ExceptionMiddleware -処理された例外を処理し、応答を返します。
  • ルーター
  • エンドポイント

HTTP例外

HTTPException クラスは、処理された例外に対して使用できる基本クラスを提供します。ExceptionMiddleware の実装は、デフォルトで任意の HTTPException に対してプレーンテキストHTTPレスポンスを返します。

  • HTTPException(status_code, detail=None, headers=None)

HTTPException は、ルートまたはエンドポイント内でのみスローする必要があります。代わりに、ミドルウェアクラスは適切な応答を直接返す必要があります。

WebSocket例外

WebSocketException クラスを使用して、WebSocketエンドポイント内でエラーを発生させることができます。

  • WebSocketException(code=1008, reason=None)

仕様で定義されている任意の有効なコードを設定できます。