Python之錯誤碼設計


在 web 項目中,我們經常使用自定義狀態碼來告知請求方請求結果以及請求狀態;在 Python 中該如何設計自定義的狀態碼信息呢?

 

1)普通類+字典設計狀態碼

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Desc: { 項目響應碼模塊 }


class RETCODE:
    OK                  = "0"
    ERROR               = "-1"
    IMAGECODEERR        = "4001"
    THROTTLINGERR       = "4002"
    NECESSARYPARAMERR   = "4003"
    

err_msg = {
    RETCODE.OK                 : "成功",
    RETCODE.IMAGECODEERR       : "圖形驗證碼錯誤",
    RETCODE.THROTTLINGERR      : "訪問過於頻繁",
    RETCODE.NECESSARYPARAMERR  : "缺少必傳參數",
}

單獨利用一個字典進行狀態碼信息對照,這樣設計一旦狀態碼多了就不好對照,再使用過程中也沒那么方便,簡單試下組織一個成功的信息

data = {
    'code': RETCODE.OK,
    'errmsg': err_msg[RETCODE.OK]
}

 

2)巧用枚舉類設計狀態碼信息

枚舉類定義:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Desc: { 項目枚舉類模塊 }

from enum import Enum


class StatusCodeEnum(Enum):
    """狀態碼枚舉類"""

    OK = (0, '成功')
    ERROR = (-1, '錯誤')
    SERVER_ERR = (500, '服務器異常')

普通的類繼承 enum 模塊中的 Enum 類就變成了枚舉類。

 

在ipython中使用:

In [21]: ok = StatusCodeEnum.OK

In [22]: type(ok)
Out[22]: <enum 'StatusCodeEnum'>

In [23]: error = StatusCodeEnum.ERROR

In [24]: type(error)
Out[24]: <enum 'StatusCodeEnum'>

In [26]: ok.name
Out[26]: 'OK'

In [27]: ok.value
Out[27]: (0, '成功')

In [28]: error.name
Out[28]: 'ERROR'

In [29]: error.value
Out[29]: (-1, '錯誤')

枚舉類中的每一個屬性都返回一個枚舉對象,其中枚舉對象有兩個重要的屬性 namevalue

  • name 枚舉對象在枚舉類中的屬性名
  • value 則是枚舉對象在枚舉類中對應屬性名的值

 

用枚舉類組組織一個成功的響應信息

code = StatusCodeEnum.OK.value[0]
errmsg = StatusCodeEnum.OK.value[1]
data = {
    'code': code,
    'errmsg': errmsg
}

 

封裝枚舉類:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Desc: { 項目枚舉類模塊 }


from enum import Enum


class StatusCodeEnum(Enum):
    """狀態碼枚舉類"""

    OK = (0, '成功')
    ERROR = (-1, '錯誤')
    SERVER_ERR = (500, '服務器異常')

    @property
    def code(self):
        """獲取狀態碼"""
        return self.value[0]

    @property
    def errmsg(self):
        """獲取狀態碼信息"""
        return self.value[1]

通過 @property 裝飾器把類型的方法當屬性使用,由於 枚舉類.屬性名 對應着不同的枚舉對象就很好的把狀態碼和信息進行了封裝。看看外部調用的結果

 

響應:

data = {
    'code': StatusCodeEnum.OK.code,
    'errmsg': StatusCodeEnum.OK.errmsg
}

 

最終demo:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Desc: { 項目枚舉類模塊 }

from enum import Enum


class StatusCodeEnum(Enum):
    """狀態碼枚舉類"""

    OK = (0, '成功')
    ERROR = (-1, '錯誤')
    SERVER_ERR = (500, '服務器異常')

    IMAGE_CODE_ERR = (4001, '圖形驗證碼錯誤')
    THROTTLING_ERR = (4002, '訪問過於頻繁')
    NECESSARY_PARAM_ERR = (4003, '缺少必傳參數')
    USER_ERR = (4004, '用戶名錯誤')
    PWD_ERR = (4005, '密碼錯誤')
    CPWD_ERR = (4006, '密碼不一致')
    MOBILE_ERR = (4007, '手機號錯誤')
    SMS_CODE_ERR = (4008, '短信驗證碼有誤')
    ALLOW_ERR = (4009, '未勾選協議')
    SESSION_ERR = (4010, '用戶未登錄')

    DB_ERR = (5000, '數據錯誤')
    EMAIL_ERR = (5001, '郵箱錯誤')
    TEL_ERR = (5002, '固定電話錯誤')
    NODATA_ERR = (5003, '無數據')
    NEW_PWD_ERR = (5004, '新密碼錯誤')
    OPENID_ERR = (5005, '無效的openid')
    PARAM_ERR = (5006, '參數錯誤')
    STOCK_ERR = (5007, '庫存不足')

    @property
    def code(self):
        """獲取狀態碼"""
        return self.value[0]

    @property
    def errmsg(self):
        """獲取狀態碼信息"""
        return self.value[1]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM