Sanic Exception – 異常

veelion發表於2019-04-10

請求處理函式可以丟擲異常,它們會被Sanic自動處理。異常以一個文字資訊作為第一個引數,同時可以把狀態碼作為第二個引數幷包含在HTTP響應返回給瀏覽器。

Sanic Exception 異常

丟擲異常

為了丟擲異常,只需使用 raise 丟擲 sanic.exceptions 模組的相應異常即可。

from sanic.exceptions import ServerError

@app.route('/killme')
async def i_am_ready_to_die(request):
    raise ServerError("Something bad happened", status_code=500)

也可以使用傳遞狀態碼的 abort 函式:

from sanic.exceptions import abort
from sanic.response import text

@app.route('/youshallnotpass')
async def no_no(request):
    abort(401)

    # 下面的不再執行
    text("OK")

處理異常

為了覆蓋 Sanic 對異常的預設處理,可以使用 @app.exception 裝飾器。該裝飾器需要一個作為引數處理的異常列表。我們可以傳遞SanicException來捕獲它們。被裝飾的異常處理函式必須以requestexception作為引數。

from sanic.response import text
from sanic.exceptions import NotFound

@app.exception(NotFound)
async def ignore_404s(request, exception):
    return text("Yep, I totally found the page: {}".format(request.url))

我們也可以像下面這樣增加一個異常處理函式:

from sanic import Sanic

async def server_error_handler(request, exception):
    return text("Oops, server error", status=500)

app = Sanic()
app.error_handler.add(Exception, server_error_handler)

有些時候,我們可能想在預設的異常處理中增加更多的錯誤處理功能,那麼我們就可以繼承 Sanic 預設的錯誤處理器:

from sanic import Sanic
from sanic.handlers import ErrorHandler

class CustomErrorHandler(ErrorHandler):
    def default(self, request, exception):
        ''' handles errors that have no error handlers assigned '''
        # You custom error handling logic...
        return super().default(request, exception)

app = Sanic()
app.error_handler = CustomErrorHandler()

有用的異常

下面是一些最有用的異常:

  • NotFund:當請求的路由沒找到時呼叫。
  • ServerError: 當伺服器內部發生錯誤時呼叫。這通常發生在使用者程式碼丟擲異常時。

更多的異常可以檢視 sanic.exceptions 模組。

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章