Опитвам се с тази проста програма да хване изключения.
Изключението делене на нула е успешно уловено. Изглежда обаче не мога да уловя препълването на целите числа.
Разбирам, че цяло число от тип 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?
Благодаря!
SmallInt
. Даде изход като -31536. Така че, с други думи, той препълва, но не попада в кода за обработка на изключения. - person itsols   schedule 07.01.2016