drf : 異常處理以及自定義異常處理
阿新 • • 發佈:2022-04-11
異常處理
在APIView的原始碼中,執行三大認證,檢視類方法的時候,如果出現了異常,會被全域性異常捕獲。
我們想要做的事將報錯資訊展示為自定義的錯誤資訊。
eg:
報錯:
{code:999,msg:伺服器異常,請聯絡系統管理員}
成功:
{code:100,msg:成功,data:[{},{}...]}
自定義APIException,此時我們自定義異常,那麼異常捕獲會優先使用自定義。
settings.py,配置檔案配置之後才會使用自定義的異常捕獲
REST_FRAMEWORK = { 'EXCEPTION_HANDLER':'app01.errors.comment_exception_handler' }
檢視from rest_framework.views import exception_handler
原始碼。
APIException異常的狀態碼為500,被自定義異常捕獲。
主動排除程式異常
最終想要呈現的效果:
from rest_framework.views import exception_handler from rest_framework.response import Response """ 在內建的settings.py 如果沒有自定義使用內建的異常捕獲。 'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler', """ def comment_exception_handler(exc, context): """ { 'view': <app01.views.TextAPIView object at 0x7fba5bde2c18>, 'args': (), 'kwargs': {}, 'request': <rest_framework.request.Request: GET '/text/'> } """ print(context) res = exception_handler(exc, context) """ 第一種情況:返回Response物件, 這表示已經處理了異常,並且只處理APIException的異常 """ if res: res = Response(data={ 'code':998, 'status':res.status_code, 'msg':res.data.get('detail','伺服器異常,聯絡系統管理員') }) else: return Response({'code': 999, 'msg': str(exc)}) request = context.get('request') view = context.get('view') print(f'錯誤原因: {str(request)}',f'錯誤檢視類: {str(view)}',f'請求方式:{str(request.method)}',f'請求路徑:{request.path}') return res
輸出:
錯誤原因: <rest_framework.request.Request: GET '/text/'> 錯誤檢視類: <app01.views.TextAPIView object at 0x7fedde3cdb38> 請求地址:GET 請求路徑:/text/