2016-01-07 14 views
2

我正在尝试这个简单的程序来捕获异常。捕获FreePascal中的整数溢出异常

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

我明白,一个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中捕获整数溢出的正确方法是什么?

谢谢!

+0

我不是在Free Pascal中的专家,但我的猜测是,溢出异常时,才会触发作为计算的结果。除以1不会更改该值,因此它不会生成异常。尝试添加或减去或乘以范围内的值,但操作结果超出范围。例如x:= 32767; x:= x + 1 – Stuart

+0

@Stuart感谢您的意见。我试着将17000乘以2并将其存储在'SmallInt'中。它的输出为* -31536 *。换句话说,它会溢出,但不会运行到异常处理代码中。 – itsols

+0

你为什么不尝试我建议的代码。 17000 * 2可能会作为整数乘法执行,并且当您将结果存储在smallint中时,它将被截断为smallint。截断整数不是一种计算,因此它可能不会生成整数溢出异常。 – Stuart

回答

0

您必须包括单位sysutils的,因为它包含了更改最深的一种运行时错误的进入捕语言异常代码

+0

感谢Marco。除了包括这个单元,我还需要做什么?我已经包含了它,它没有任何改变。 – itsols

+0

对于它的价值,我的编译器版本在帮助>关于菜单中显示了2.6.2-8 – itsols