1. 程式人生 > 其它 >drf : 異常處理以及自定義異常處理

drf : 異常處理以及自定義異常處理

異常處理

在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/