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

掌握 C++Builder 除錯藝術(一):乾淨程式碼、例外處理、記錄機制與全域例外攔截

     編輯:關於C++

除錯哲學:不只是工具,更是工程紀律

真正的除錯始於**寫代碼之前**。Bug 越少、處理越優雅,使用者體驗越好、回報品質越高。

第一原則:撰寫乾淨、可讀的程式碼

  • 完工後**回顧並加註解**:說明「做什麼」與「為什麼」
  • 多花時間寫清楚,省下數小時追蹤難解 Bug
  • 參考:Scott 的《代碼風格》文章

第二原則:善用 C++ 例外機制

為什麼不用回傳值?

  • 舊式 API 用回傳值報錯,**極易被忽略**
  • 例外:**無法被忽略**,強制處理或傳播

自訂例外類別


class MyException {
public:
    AnsiString Message;
    MyException(AnsiString msg) : Message(msg) {}
};

// 拋出
throw new MyException("Test exception message");

try-catch-__finally 完整結構


try {
    // 正常執行碼
}
catch (EDBEngineError &e) {
    // 資料庫引擎錯誤
}
catch (EExternalError &e) {
    // Windows 系統錯誤
}
catch (Exception &e) {
    // 所有其他 VCL 例外(基類捕獲)
}
catch (...) {
    // 捕獲所有未預期例外(安全網)
}
__finally {
    // 無論是否有例外**必定執行**
    // 釋放資源、恢復游標、重置旗標
}

關鍵規則

  • 捕獲順序:具體 → 一般(衍生類別先於基類別)
  • 重新拋出:throw; 保留原例外繼續傳播
  • __finally:Borland 擴充,資源清理最佳位置
  • 多型性:e.ClassName() 可取得實際例外型別名稱

第三原則:建立記錄機制

無法使用除錯器場景:NT 服務、ISAPI/CGI、即時系統、客戶端環境。

方案一:OutputDebugString


OutputDebugString("Debug message");
// 除錯器附著時顯示於輸出視窗,否則靜默忽略
// 發布前用 #ifdef DEBUG 包圍移除

方案二:GExperts DebugIntf(推薦)

  • 獨立小程式 GDebug.exe,可發送給客戶
  • 專案加入 dbugint.pas,含 #include "dbugintf.hpp"
  • API:SendDebug()、SendDebugEx()、SendMethodEnter/Exit()、SendSeparator()
  • 免費開源:https://www.gexperts.org/

方案三:自訂記錄控制項

  • 避免 RichEdit** 記錄大量文字 → 效能崩潰、記憶體碎片
  • 使用 ListBox + Style = lbOwnerDrawFixed 自繪(GExperts 採用)
  • 或寫入文字檔/資料庫,非 UI 執行緒處理

第四原則:記錄與例外結合

**組件開發者必備模式**— 每個主要函數首尾包裝:


try {
    // 函數本體
}
catch (Exception &e) {
    SendDebug("Exception in ClassName::FunctionName: " 
        + e.ClassName() + " - " + e.Message);
    // 可選:throw; 重新拋出
}
  • e.ClassName() 利用 RTTI 取得實際例外型別(多型關鍵)
  • 代價:執行檔體積增大(無痛無獲)

第五原則:全域例外處理器

主視窗 OnCreate 安裝:


void __fastcall TMainForm::AppExceptionHandler(TObject* Sender, Exception* E) {
    // 顯示友善對話框:E->Message、E->ClassName()
    // 記錄錯誤、提供回報管道(Email、檔案、上傳)
    // 記錄堆疊、環境資訊
}

Application->OnException = AppExceptionHandler;
  • **幾乎捕獲所有未處理例外**
  • 避免使用者看到「位址 0xXXXX 發生 Access Violation」這類無用訊息
  • 提供結構化錯誤回報,大幅提升支援效率

下一步:整合除錯器

下一篇將深入 IDE 內建除錯器:單步、斷點、變數檢視、Call Stack 等進階技巧。

原著:Bill King | 翻譯:史平洋 (cker)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved