Exception handling 捕获FreePascal中的整数溢出异常

Exception handling 捕获FreePascal中的整数溢出异常,exception-handling,pascal,freepascal,integer-overflow,Exception Handling,Pascal,Freepascal,Integer Overflow,我正在尝试这个简单的程序来捕获异常 已成功捕获除零异常。但是,我似乎无法捕获整数溢出 我知道,SmallInt类型的整数将在+32767之后溢出,因为最大有符号值=2^15-1(即+32767) 代码如下: Program ss; Var Price, Qty: SmallInt; Rate: Real; Begin Try write('Enter Total price '); Readln(Price); Write('Enter qty '); Rea

我正在尝试这个简单的程序来捕获异常

已成功捕获除零异常。但是,我似乎无法捕获整数溢出

我知道,SmallInt类型的整数将在+32767之后溢出,因为最大有符号值=2^15-1(即+32767)

代码如下:

Program ss;

Var

  Price, Qty: SmallInt;
  Rate: Real;

Begin
  Try

    write('Enter Total price '); Readln(Price);
    Write('Enter qty '); Readln(Qty);

    Rate := Price / Qty;
    Writeln('Single item = ', Rate:0:2);

  except
    On EDivByZero Do Writeln('qty must be a valid num above 0');
    On EIntOverflow Do Writeln('too large')
  end;
End.
但是,似乎没有捕获溢出异常。相反,溢出值被视为负数,代码继续运行,就好像没有任何错误一样

以下是输出:

输入总价32768

输入数量1

单项=-32768.00

按任意键返回IDE

我是不是在代码中做错了什么?捕捉FreePascal中整数溢出的正确方法是什么


谢谢

您必须包含unit sysutils,因为它包含将最深类型的运行时错误更改为可捕获的语言异常的代码

我不是Free Pascal的专家,但我猜溢出异常只会在计算结果中触发。除以1不会更改值,因此不会生成异常。尝试将范围内的值相加、相减或相乘,但运算结果超出范围。例如x:=32767;x:=x+1@Stuart谢谢你的意见。我尝试将17000乘以2,并将其存储在
SmallInt
中。它给出的输出为-31536。换句话说,它会溢出,但不会运行到异常处理代码中。为什么不试试我建议的代码呢。17000*2可能会作为整数乘法执行,当您将结果存储在smallint中时,它会被截断为smallint截断整数不是计算,因此它可能不会生成整数溢出异常。@Stuart对于您的示例,输出为-32768(这是溢出值)并且不会触发任何异常。我回忆起一些旧的语言(我想它是VB6,但我现在无法确认),给出了类似的结果。再次感谢,谢谢你,马可。除了这个单元,还有什么我需要做的吗?我已经包含了它,它可以正常工作,没有任何更改。值得一提的是,我的编译器版本在“帮助”>“关于”菜单上显示了2.6.2-8