實數運算產生,皆繼承自 EMathError,執行期引發其子類別:
| 異常類別 | 觸發原因 |
|---|---|
| EInvalidOp | 處理器遇到未定義指令 |
| EZeroDivide | 嘗試除以零 |
| EOverFlow | 浮點數上溢 |
| EUnderFlow | 浮點數下溢 |
無數學協處理器機器遇到協處理器指令。Delphi 預設將浮點運算編譯為協處理器指令,386 以下機器常遇此錯誤。解決:單元介面部加入 {$N-} 編譯指示,改用執行階段庫進行浮點運算。
各型別浮點數(Real、Single、Double、Extended)越界引發相同溢出異常,與整數異常類別不同。
使用 as 運算子將物件轉型失敗時引發。
轉換函數將資料從一種形式轉換為另一種形式失敗時引發,尤以字串轉數值最常見。例:
var rl: Real; int: Integer;
begin
rl := StrToFloat(' $140.48'); { 含貨幣符號與空格 }
int := StrToInt(' 1,402 '); { 含千分位逗號與空格 }
end;
注意:非所有轉換函數引發 EConvertError。Val 函數轉換失敗僅回傳錯誤代碼,第 6.2 節利用此特性實現輸入型別與範圍檢查。
兩種情況:處理器偵測到無法處理的錯誤、程式產生中斷嘗試終止執行。硬體異常無法編譯進 DLL,僅標準應用程式可用。皆為 EProcessor 子類別,執行期不直接引發 EProcessor。
| 異常類別 | 觸發原因 |
|---|---|
| EFault | 基礎異常類別,其他硬體異常父類別 |
| EGPFault | 一般保護錯誤,通常由未初始化指標/物件引起 |
| EStackFault | 非法存取處理器堆疊段 |
| EPageFault | Windows 記憶體管理器無法正確使用交換檔 |
| EInvalidOpCode | 處理器遇到未定義指令,通常意味操作非法資料或未初始化記憶體 |
| EBreakPoint | 應用程式產生斷點中斷 |
| ESingleStep | 應用程式產生單步中斷 |
EFault、EGPFault 常意味致命錯誤。EBreakPoint、ESingleStep 由 Delphi IDE 內建偵錯器處理。前五種硬體異常對開發者極具挑戰性。