12.1.1.4 浮點異常
浮點異常是在進行實數操作時產生的,它們都從一個EMathError類派生,但與整數異常相同,程序運行中引發的總是它的子類EInvalidOp、EZeroDivide、EOverFlow、EUnderFlow。
表12.4 浮點異常類及其引發原因
━━━━━━━━━━━━━━━━━━━━━━━━
異常類 引發原因
────────────────────────
EInvalidOp 處理器碰到一個未定義的指令
EZeroDivide 試圖被零除
EOverFlow 浮點上溢
EUnderFlow 浮點下溢
━━━━━━━━━━━━━━━━━━━━━━━━
EInvalidOp最常見的引發原因是沒有協處理器的機器遇到一個協處理器指令。由於在缺省情況下Delphi總是把浮點運算編譯為協處理器指令,因而在386以下微機上常常會碰到這個錯誤。此時只需要在單元的接口部分設置全局編譯指示{$N-},選擇利用運行時間庫進行浮點運算,問題就可以解決了。
各種類型的浮點數(Real、Single、Double、Extended)越界引起同樣的溢出異常。這同整數異常類是不同的。
12.1.1.5 類型匹配異常
類型匹配異常EInvalidCast當試圖用As 操作符把一個對象與另一類對象匹配失敗後引發。
12.1.1.6 類型轉換異常
類型轉換異常EConvertError當試圖用轉換函數把數據從一種形式轉換為另一種形式時引發,特別是當把一個字符串轉換為數值時引發。下面程序中的兩條執行語句都將引發一個EConvertError異常。
var
rl : Real;
int: Integer;
begin
rl := StrToFloat(' $140.48');
int := StrToInt(' 1,402 ');
end;
要注意並不是所有的類型轉換函數都會引發EConvertError異常。比如函數Val當它無法完成字符串到數值的轉換時只把錯誤代碼返回。利用這一點我們在(6.2)節中實現了輸入的類型和范圍檢查。
12.1.1.7 硬件異常
硬件異常發生的情況有兩種:或者是處理器檢測到一個它不能處理的錯誤,或者是程序產生一個中斷試圖中止程序的執行。硬件異常不能編譯進動態鏈接庫(DLLs)中,而只能在標准的應用中使用。
硬件異常都是EProcessor異常類的子類。但運行時間並不會引發一個EProcessor 異常。
表12.5 硬件異常類及其產生原因
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
異常類 引發原因
─────────────────────────────────
Efault 基本異常類。是其它異常類的父類
EGPFault 一般保護錯。通常由一個未 初始化的指針或對象引起
EStackFault 非法訪問處理器的棧段
EPageFault Windows內存管理器不能正確使用交換文件
EInvalidOpCode 處理器碰到一個未定義的指令。這通常意味著處理器
試圖去操作非法數據或未初始化的內存
EBreakPoint 應用程序產生一個斷點中斷
ESingleStep 應用程序產生一個單步中斷
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
EFault、EGPFault 往往意味著致命的錯誤。而EBreakPoint、ESingleStep被Delphi IDE的內置調試器處理。事實上前邊的五種硬件異常的響應和處理對開發者來說都是十分棘手的問題。