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

Delphi 進階異常類別:浮點數、型別轉換、硬體異常完整體系與觸發條件深度解析

     編輯:Delphi

浮點數異常體系

實數運算產生,皆繼承自 EMathError,執行期引發其子類別:

異常類別觸發原因
EInvalidOp處理器遇到未定義指令
EZeroDivide嘗試除以零
EOverFlow浮點數上溢
EUnderFlow浮點數下溢

EInvalidOp 常見成因與解決

無數學協處理器機器遇到協處理器指令。Delphi 預設將浮點運算編譯為協處理器指令,386 以下機器常遇此錯誤。解決:單元介面部加入 {$N-} 編譯指示,改用執行階段庫進行浮點運算。

各型別浮點數(Real、Single、Double、Extended)越界引發相同溢出異常,與整數異常類別不同。

型別轉換異常

EInvalidCast - 型別比對失敗

使用 as 運算子將物件轉型失敗時引發。

EConvertError - 型別轉換失敗

轉換函數將資料從一種形式轉換為另一種形式失敗時引發,尤以字串轉數值最常見。例:

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非法存取處理器堆疊段
EPageFaultWindows 記憶體管理器無法正確使用交換檔
EInvalidOpCode處理器遇到未定義指令,通常意味操作非法資料或未初始化記憶體
EBreakPoint應用程式產生斷點中斷
ESingleStep應用程式產生單步中斷

EFault、EGPFault 常意味致命錯誤。EBreakPoint、ESingleStep 由 Delphi IDE 內建偵錯器處理。前五種硬體異常對開發者極具挑戰性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved