Lewati ke isi

Pengecualian

Starlette memungkinkan Anda memasang penangan pengecualian khusus untuk menangani cara mengembalikan respons saat terjadi kesalahan atau pengecualian yang ditangani.

Starlette.application diimpor dari Starlette
Dari starlette.exceptions impor HTTPException
Dari bintang. permintaan permintaan impor
Dari pemula. Tanggapan impor HTMLResponse


HTML _ 404 _ HALAMAN =...
HTML _ 500 _ HALAMAN =...


Async def tidak _ ditemukan (permintaan: Permintaan, exc: HTTPException):
    Kembali HTMLResponse (konten = HTML _ 404 _ HALAMAN, status _ kode = exc. status _ kode)

Async def server _ error (permintaan: Permintaan, exc: HTTPException):
    Kembali HTMLResponse (konten = HTML _ 500 _ HALAMAN, status _ code = exc. status _ code)


pengecualian _ penangan = {
    404: tidak _ ditemukan,
    500: server _ error
}

Aplikasi = Starlette (rute = rute, pengecualian _ penangan = pengecualian _ penangan)

Jika debug diaktifkan dan terjadi kesalahan, Starlette akan menggunakan respons mundur alih-alih 500 pawang yang dipasang.

Aplikasi = Starlette (debug = Benar, rute = rute, pengecualian _ penangan = pengecualian _ penangan)

Selain mendaftarkan penangan untuk kode status tertentu, Anda juga dapat mendaftarkan penangan untuk kelas pengecualian.

Secara khusus, Anda mungkin ingin mengesampingkan penanganan kelas HTTPException built-in. Misalnya, menggunakan respons gaya JSON:

Async def http _ exception (permintaan: Permintaan, exc: HTTPException):
    Kembalikan JSONResponse ({"detail": exc.detail}, status _ code = exc. status _ code)

pengecualian _ penangan = {
    Pengecualian HTTP: http _ pengecualian
}

HTTPException juga dilengkapi dengan parameter headers. Hal ini memungkinkan header untuk disebarkan ke kelas respons:

Async def http _ exception (permintaan: Permintaan, exc: HTTPException):
    Mengembalikan JSONResponse (
        {"detail": exc.detail},
        status _ code = exc. status _ code,
        Header = exc.headers
    )

Anda mungkin juga ingin mengesampingkan penanganan WebSocketException:

Async def websocket _ pengecualian (websocket: WebSocket, exc: WebSocketException):
    Tunggu websocket.close (kode = 1008)

pengecualian _ penangan = {
    WebSocketPengecualian: websocket _ pengecualian
}

Kesalahan dan menangani pengecualian

Penting untuk membedakan antara pengecualian dan kesalahan yang ditangani.

Pengecualian yang ditangani tidak mewakili kondisi kesalahan. Mereka dipaksa menjadi respons HTTP yang sesuai dan kemudian di kirim melalui tumpukan middleware standar. Secara default, kelas HTTPException digunakan untuk mengelola pengecualian yang ditangani.

Kesalahan adalah pengecualian lain yang terjadi dalam aplikasi. Kondisi ini harus menggelembung sebagai pengecualian di seluruh tumpukan middleware. Setiap kesalahan logging middleware harus memastikan bahwa pengecualian dinaikkan kembali sampai ke server.

Padahal, penanganan kesalahan yang digunakan adalah exception_handler[500] atau exception_handler[Exception]. Baik kunci 500 maupun Exception dapat digunakan. Lihat di bawah ini:

Async def handle _ error (permintaan: Permintaan, exc: HTTPException):
    Lakukan beberapa logika
    Kembalikan JSONResponse ({"detail": exc.detail}, status _ code = exc. status _ code)

pengecualian _ penangan = {
    Pengecualian: handle _ error # atau "500: handle _ error"
}

Penting untuk dicatat bahwa jika BackgroundTask melempar pengecualian, itu akan ditangani oleh fungsi handle_error, tetapi respons telah di kirim. Dengan kata lain, respons yang dibuat oleh handle_error akan dibuang. Jika kesalahan terjadi sebelum respons di kirim, maka objek respons digunakan - dalam contoh di atas,JSONResponse yang dikembalikan.

Untuk menangani perilaku ini dengan benar, tumpukan middleware dari aplikasi Starlette dikonfigurasi sebagai berikut:

  • ServerErrorMiddleware - 500 tanggapan dikembalikan ketika kesalahan terjadi pada server.
  • peralatan tengah terpasang
  • ExceptionMiddleware Tangani pengecualian yang ditangani dan kembalikan tanggapan.
  • Router
  • titik akhir

Pengecualian HTTP

Kelas HTTPException menyediakan kelas dasar yang dapat Anda gunakan untuk setiap pengecualian yang ditangani. Implementasi ExceptionMiddleware mengembalikan respons HTTP teks biasa secara default untuk HTTPException apa pun.

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

Anda hanya boleh menaikkan HTTPException di dalam rute atau titik akhir. Sebaliknya, kelas middleware harus mengembalikan respons yang sesuai secara langsung.

Pengecualian WebSocket

Anda dapat menggunakan kelas WebSocketException untuk meningkatkan kesalahan di dalam titik akhir WebSocket.

  • WebSocketException(code=1008, reason=None)

Anda dapat mengatur kode valid apa pun seperti yang didefinisikan dalam spesifikasi.