首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

程式設計風格規範系列(五):錯誤處理策略與斷言最佳實踐

     編輯:關於C++

前言

本系列第五部分聚焦 **錯誤處理**:如何分類上報、盡早發現、嚴格測試,構建健壯軟體的防線。

一、錯誤上報分類:依 UI 相關性決定機制

函數類別特徵錯誤上報方式
非 UI 函數不直接與使用者互動 (工具函式、演算法、資料存取)**回傳值** 帶錯誤碼;嚴禁彈視窗/寫日誌 (職責不清)
UI 函數直接與使用者互動 (對話框、視窗處理)**自行彈出警告** 並處理;不向上層拋回錯誤碼

通用錯誤處理函數:集中 `switch(errCode)` 處理,避免分散式 `if-else` 污染業務邏輯。

二、盡早發現錯誤:三大手段

1. 重視編譯器警告

  • 警告往往揭示潛在缺陷 (型別轉換遺失精度、未初始化變數、有號/無號比較)。
  • **策略**:`/W4` (MSVC) 或 `-Wall -Wextra` (GCC/Clang) + **視警告為錯誤** (`/WX` / `-Werror`),強迫修正才能編譯通過。

2. 善用斷言 —— 開發期守門員

適用場景 (必加斷言)

  • 函數入口參數驗證,特別是指標非空、索引邊界、狀態前置條件。
  • 程式設計假設 (如「此處鎖定已被持有」、「該物件必須已初始化」)。
  • 自以為「不可能發生」的分支 (防禦性程式設計核心)。

斷言 vs 運行期檢查

維度`ASSERT(expr)``if (!expr) return ERR;`
編譯版本Debug 保留,Release **完全移除** (零開銷)所有版本保留
效能影響Release 無任何指令永遠有分支預測/指令開銷
健壯性僅開發期生效,Release 不攔截全生命週期防護
適用對象**程式設計錯誤** (違反契約、邏輯 Bug)**運行期錯誤** (資源耗盡、輸入無效、網路失敗)

混合策略 (高頻/效能敏感函數)

// 開發期斷言攔截程式錯誤,釋出版仍保留基本防護
ASSERT(pvToMem && pvFromMem);           // Debug 攔截空指標
if (!pvToMem || !pvFromMem) {           // Release 基本防護
    return CM_POINT_IS_NULL;
}

原則:高頻/效能敏感 → 斷言 + 最小運行期檢查;一般函數 → 完整運行期檢查;Debug 版所有內部 DLL/EXE 必須帶斷言符號。

3. 嚴格測試:覆蓋邊界與臨界點

  • 每段代碼入庫前必須通過單元測試。
  • 重點測試:零值、最大/最小值、空指標、空容器、逾時、權限拒絕、網路中斷、磁碟滿。
  • 目標:**零已知缺陷交付** (Zero Known Defects)。

三、錯誤處理代碼範本

long cmMemCpy(void* pvTo, const void* pvFrom, size_t sz)
{
    long lResult = CM_OK;
    ASSERT(pvTo && pvFrom);                 // 開發期契約檢查
    if (!pvTo || !pvFrom) {                 // 運行期基本防護
        lResult = CM_POINT_IS_NULL;
        goto END;
    }
    // ... 核心邏輯 ...
END:
    return lResult;
}

總結

錯誤處理的核心哲學是 **「分層防禦」**:

  1. **編譯期**:最高警告等級 + 視警告為錯誤,攔截語法/型別層面隱患。
  2. **開發期**:斷言驗證契約與假設,零成本捕捉程式設計錯誤。
  3. **測試期**:系統化邊界測試,暴露邏輯與環境互動缺陷。
  4. **運行期**:非 UI 函數回傳錯誤碼,UI 函數就地處理,統一錯誤碼體系貫穿始終。

斷言不是「偷懶不寫檢查」,而是 **「精準區分程式錯誤與運行錯誤」** 的專業工具。正確使用斷言,能同時獲得開發期高敏感度與釋放版高效能,是成熟 C/C++ 工程師的標誌技能之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved