EIntOverFlow异常类在IntegerWordLongint三种整数类型越界时引发如
var
I : Integer;
abc : Word;
begin
a := ;
b := ;
c := ;
for I := to do
begin
c := a*b*c;
end;
end;
引发一个EIntOverFlow异常
EIntOverFlow异常类只有在编译选择框Option|Project|Over_Flow_Check Option选中时才产生当关闭溢出检查则溢出后变量保留该类整数的最大范围值
整数类型的范围如下表
表 整数类型的范围
━━━━━━━━━━━━━━━━━━━━━━━━━━━
类型 范围 格式
───────────────────────────
Shortint 有符号位
Integer 有符号位
Longint 有符号位
Byte 无符号位
Word 无符号位
━━━━━━━━━━━━━━━━━━━━━━━━━━━
浮点异常
浮点异常是在进行实数操作时产生的它们都从一个EMathError类派生但与整数异常相同程序运行中引发的总是它的子类EInvalidOpEZeroDivideEOverFlowEUnderFlow
表 浮点异常类及其引发原因
━━━━━━━━━━━━━━━━━━━━━━━━
异常类 引发原因
────────────────────────
EInvalidOp 处理器碰到一个未定义的指令
EZeroDivide 试图被零除
EOverFlow 浮点上溢
EUnderFlow 浮点下溢
━━━━━━━━━━━━━━━━━━━━━━━━
EInvalidOp最常见的引发原因是没有协处理器的机器遇到一个协处理器指令由于在缺省情况下Delphi总是把浮点运算编译为协处理器指令因而在以下微机上常常会碰到这个错误此时只需要在单元的接口部分设置全局编译指示{$N}选择利用运行时间库进行浮点运算问题就可以解决了
各种类型的浮点数(RealSingleDoubleExtended)越界引起同样的溢出异常这同整数异常类是不同的
类型匹配异常
类型匹配异常EInvalidCast当试图用As 操作符把一个对象与另一类对象匹配失败后引发
类型转换异常
类型转换异常EConvertError当试图用转换函数把数据从一种形式转换为另一种形式时引发特别是当把一个字符串转换为数值时引发下面程序中的两条执行语句都将引发一个EConvertError异常
var
rl : Real;
int: Integer;
begin
rl := StrToFloat( $)
int := StrToInt( )
end;
要注意并不是所有的类型转换函数都会引发EConvertError异常比如函数Val当它无法完成字符串到数值的转换时只把错误代码返回利用这一点我们在()节中实现了输入的类型和范围检查
硬件异常
硬件异常发生的情况有两种或者是处理器检测到一个它不能处理的错误或者是程序产生一个中断试图中止程序的执行硬件异常不能编译进动态链接库(DLLs)中而只能在标准的应用中使用
硬件异常都是EProcessor异常类的子类但运行时间并不会引发一个EProcessor 异常
表 硬件异常类及其产生原因
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
异常类 引发原因
─────────────────────────────────
Efault 基本异常类是其它异常类的父类
EGPFault 一般保护错通常由一个未 初始化的指针或对象引起
EStackFault 非法访问处理器的栈段
EPageFault Windows内存管理器不能正确使用交换文件
EInvalidOpCode 处理器碰到一个未定义的指令这通常意味着处理器
试图去操作非法数据或未初始化的内存
EBreakPoint 应用程序产生一个断点中断
ESingleStep 应用程序产生一个单步中断
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
EFaultEGPFault 往往意味着致命的错误而EBreakPointESingleStep被Delphi IDE的内置调试器处理事实上前边的五种硬件异常的响应和处理对开发者来说都是十分棘手的问题
[] [] [] []