參加技術大會聽講 SEH 與 C++ 異常實作,雖未聽到預期內容,但引發對異常機制效能與工程取捨的思考。以下整理 VC6 異常實作特性與個人不使用異常的理由。
FS: 段暫存器保存框架資訊,關閉異常(/EHsc-)可省略 prologue/epilogue 代碼,減少程式碼體積與指令快取壓力。整數除零確會觸發異常,但非數學程式極少用除法,且邏輯通常能保證分母非零;浮點除零產生 INF/NaN 而非異常。以此論證異常優越性說服力有限。
int foo() {
int ret = 0;
Resource* r1 = acquire1();
if (!r1) { ret = -1; goto EXIT; }
Resource* r2 = acquire2();
if (!r2) { ret = -2; goto RELEASE_R1; }
// ... 正常邏輯 ...
RELEASE_R1:
release(r1);
EXIT:
return ret;
}
集中清理資源,流程清晰,效能可預期,適合系統級開發。
異常機制有其適用場景(如深層呼叫鏈的錯誤傳遞),但在效能敏感、資源受限、大量協程的系統級專案,錯誤碼 + goto 清理 往往是更務實的選擇。