請求處理函式可以丟擲異常,它們會被Sanic自動處理。異常以一個文字資訊作為第一個引數,同時可以把狀態碼作為第二個引數幷包含在HTTP響應返回給瀏覽器。
丟擲異常
為了丟擲異常,只需使用 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
來捕獲它們。被裝飾的異常處理函式必須以request
和exception
作為引數。
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
模組。
我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。
***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***