真正的除錯始於**寫代碼之前**。Bug 越少、處理越優雅,使用者體驗越好、回報品質越高。
class MyException {
public:
AnsiString Message;
MyException(AnsiString msg) : Message(msg) {}
};
// 拋出
throw new MyException("Test exception message");
try {
// 正常執行碼
}
catch (EDBEngineError &e) {
// 資料庫引擎錯誤
}
catch (EExternalError &e) {
// Windows 系統錯誤
}
catch (Exception &e) {
// 所有其他 VCL 例外(基類捕獲)
}
catch (...) {
// 捕獲所有未預期例外(安全網)
}
__finally {
// 無論是否有例外**必定執行**
// 釋放資源、恢復游標、重置旗標
}
throw; 保留原例外繼續傳播e.ClassName() 可取得實際例外型別名稱無法使用除錯器場景:NT 服務、ISAPI/CGI、即時系統、客戶端環境。
OutputDebugString("Debug message");
// 除錯器附著時顯示於輸出視窗,否則靜默忽略
// 發布前用 #ifdef DEBUG 包圍移除
GDebug.exe,可發送給客戶dbugint.pas,含 #include "dbugintf.hpp"SendDebug()、SendDebugEx()、SendMethodEnter/Exit()、SendSeparator()ListBox + Style = lbOwnerDrawFixed 自繪(GExperts 採用)**組件開發者必備模式**— 每個主要函數首尾包裝:
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;
下一篇將深入 IDE 內建除錯器:單步、斷點、變數檢視、Call Stack 等進階技巧。
原著:Bill King | 翻譯:史平洋 (cker)