真正的除錯藝術始於代碼編寫之初。乾淨、可讀、可維護的代碼能從根源上減少 Bug;完善的異常處理與日誌機制能在問題發生時快速定位。本系列將從代碼規範、異常策略、IDE 除錯技巧三大維度,系統提升你的除錯效能。
推薦閱讀:《Code Complete》、《Clean Code》、《Effective C++》
CreateFile 返回)。class AppException {
public:
AnsiString message;
int errorCode;
AppException(const AnsiString& msg, int code = 0) : message(msg), errorCode(code) {}
};
class DBException : public AppException {
public:
AnsiString sqlState;
DBException(const AnsiString& msg, const AnsiString& state, int code)
: AppException(msg, code), sqlState(state) {}
};
void execute_query(const AnsiString& sql) {
if (!db->Execute(sql)) {
throw DBException("Query failed", db->GetSQLState(), db->GetErrorCode());
}
}
try {
execute_query("SELECT * FROM users");
} catch (DBException& e) {
LogError(e.message, e.sqlState, e.errorCode);
ShowMessage("資料庫錯誤:" + e.message);
} catch (AppException& e) {
LogError(e.message);
ShowMessage("應用程式錯誤:" + e.message);
} catch (...) {
LogError("未知嚴重錯誤");
ShowMessage("系統發生未預期錯誤,請聯繫管理員");
}
catch (Exception& e) 避免切割衍生類資訊。catch (...) 兜底。throw; 或轉拋更高層異常。日誌是事後追蹤的「黑盒子」。關鍵點:
OutputDebugString。class Stack {
std::vector<int> data;
public:
void push(int v) { data.push_back(v); }
int pop() {
if (data.empty()) throw AppException("Stack underflow");
int v = data.back(); data.pop_back(); return v;
}
int top() const {
if (data.empty()) throw AppException("Stack empty");
return data.back();
}
};
前置條件(如非空)失敗即拋出異常,呼叫端無需檢查返回值,代碼更線性清晰。
__try / __except (MSVC) 捕獲結構化異常 (SEH) 並轉為 C++ 異常。下一篇將深入 C++Builder IDE 除錯器實戰:斷點策略、變數監視、單步執行技巧、Call Stack 分析、CPU 視窗進階用法。