錯誤碼與規範程序異常

如何優雅的處理程序中的錯誤?

程序在運行過程中,由於網絡,併發,誤操作等等,難免會出現一些意料之外的問題。直接崩潰或者讓使用者感知這個又不太合適,因此對於用戶而言,需要一定的人性化的提示、錯誤描述或修復建議。

但對於開發或維護者而言,如果只有錯誤提示信息,這些冗長的提示並不能快速定位問題,他們需要的是一個描述錯誤的關鍵信息(摘要信息)。

因此需要一種更好的方式來管理程序錯誤。其中一種比較好的方式便是邏輯層返回錯誤碼給視圖層,視圖層來展示錯誤信息/描述。

錯誤碼的優勢

核心有兩個思想 索引封裝

使用錯誤碼的優勢體現在下面幾個方面:

  • 快速定位問題
    • 無論是代碼或者日誌,直接搜索錯誤碼是非常快速的
  • 利於自動化處理
    • 根據日誌中的錯誤碼,進行自動化處理或告警
    • 使得接口調用者可以根據錯誤碼做出一定的處理,若只有提示信息,則不能很好的進行。
  • 降低溝通成本、減少信息在溝通、傳遞時的損耗
    • 出錯時,如果只根據錯誤信息描述,在溝通時可能出現偏差,在描述錯誤信息時可能會出現損耗而出現歧義或疏漏,但使用錯誤碼不會。
  • 利於流程管理
    • 可以根據錯誤碼生產文檔,可能產生的錯誤一目瞭然
  • 提高程序性能
    • 由於錯誤碼佔用空間一般遠小於錯誤提示信息佔用空間,因此無論在網絡傳輸或是程序處理時,效率遠遠高於錯誤提示信息
  • 利於版本迭代、升級
    • 隨着軟件升級、版本的迭代,只要錯誤碼還是不變的,即便修改錯誤描述信息,也不會引起混亂。
  • 利於差異化展示錯誤信息
    • 不同的國家、地區、語言的用戶,對於文字的偏好不同,使用錯誤碼可以更輕鬆的針對用戶的喜好修改提示信息。
  • 封裝的思想
    • 隱藏內部實現、敏感信息,降低軟件邊界的耦合
  • 利於代碼維護
    • 如果直接將提示信息寫在代碼中,一是增加代碼體積;二是當軟件功能增多時,維護成本將大大提升,而使用錯誤碼時,維護成本增加的沒那麼快。
    • 對於多人協作的開發模式而言,編碼和交互可以由不同的人員專門負責,職責單一,專人辦專事。

錯誤碼的代價

使用錯誤碼有這麼多好處,那麼它代價(成本)是怎樣的呢?

錯誤碼的代價:

  • 引入額外的開發成本
    • 需要定義錯誤碼,且不能與已有錯誤碼重複
    • 開發者需要使用錯誤碼錶達錯誤信息,就需要額外維護他們的映射關係以及思維上的轉變。
  • 錯誤信息隱藏
    • 無法直接從錯誤碼中獲取詳細的信息,必須藉助錯誤碼文檔等映射工具才能獲取有用信息。

其實引入錯誤碼的弊端是和好處對應的,在解決一些問題的同時也引入了另外的的問題。

結論

雖然看到錯誤碼的優勢是遠遠大於弊端的,但對於個人開發者或者生命週期短的小型軟件而言,上面的優勢並不明顯,直接輸出提示則更好。


如何管理錯誤碼

當軟件的功能越來越多時,他的成本也因此升高,因此需要更高效的使用錯誤碼。

規範錯誤碼格式

按照一定格式將錯誤碼的分類有利於減少錯誤碼重複/衝突,方便定義錯誤碼,方便快速定位問題。

使用從左到右依次分類、細化

如HTTP協議中第一位是大類分類,剩下的是遞增的子類型錯誤,如看到4xx便關注調用者的錯誤,看到5xx更關注服務提供者的錯誤。

壓縮錯誤碼長度

大型軟件中往往以十六進制串作爲錯誤碼,因爲同樣長度的16進制比10進制的數看起來更簡短,更短即更快,無論是表達和轉述或是存儲。

示例
  • 最高一位固定0,使用數字數表示時永遠爲正數,表達式中沒有負號只有數字,避免歧義
  • 第二位0表示系統意料之中的用戶輸入導致的異常,爲1表示系統由於所依賴的基礎設施(如網絡、系統、其他軟件)不能正確響應而導致的錯誤。
  • 第3-13位標識某一個軟件/服務
  • 剩餘位數由服務內部定義,可以按照模塊等劃分

所有錯誤碼都統一按照相同規範劃分完畢後,一看到錯誤碼,就可以立刻定位到是系統哪裏發生了問題,然後便可以安排對應部分負責人排查。

代碼中如何選擇錯誤碼的類型

在一定規範前提下,C、C++這類基礎的程序常常位於底層,與其他程序交互較少或作爲提供者,與之交互的系統也通常位數字表達狀態,因此使用數字類型更好,如int32比字符串或者枚舉佔用更少的內存。

而更上層的一些語言,經常與其他系統打交道,更適合用String以獲取更好的兼容性,由於一個服務中不同錯誤碼有大量的位重複,有的語言利用了字典樹,反而可能更節省空間


更多

關於錯誤碼遠遠不止這些,還有更多的問題待我們解決~

錯誤碼的使用(落地)

合理規範何時必須記錄錯誤碼,使用範圍。
如error級別日誌必須記錄錯誤碼,接口如果不能正確響應,則必須定義錯誤碼等。

錯誤碼的管理

如何更高效的維護錯誤碼和異常的映射關係。

  • 建立錯誤碼多語言管理平臺(錄入+查詢)
    • 如何更高效的錄入錯誤碼?
  • 日誌分析與告警
    • 方案?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章