|
@@ -0,0 +1,38 @@
|
|
|
+{$mode objfpc}
|
|
|
+program test_raise;
|
|
|
+
|
|
|
+uses Math;
|
|
|
+
|
|
|
+var
|
|
|
+ X, Y: double;
|
|
|
+ I: Integer;
|
|
|
+ SomeFloat, SomeOtherFloat: Double;
|
|
|
+begin
|
|
|
+ X := -10.0;
|
|
|
+
|
|
|
+ SomeFloat := 1.0; { any value }
|
|
|
+ SomeOtherFloat := 1.0; { any value }
|
|
|
+
|
|
|
+ for I := 0 to 20 do
|
|
|
+ begin
|
|
|
+ { This line does *any* valid float operation, just to show that
|
|
|
+ floating-point exception (that should be raised, catched and silenced
|
|
|
+ by try..except below) somehow arrived here. }
|
|
|
+ SomeFloat := I * SomeOtherFloat;
|
|
|
+
|
|
|
+ try
|
|
|
+ { Any invalid fp operation. Tested on Sqrt(-10.0), Ln(-10.0).
|
|
|
+ I use variable X to trick FPC into calculating this at run-time,
|
|
|
+ otherwise "Error: Illegal constant passed to internal math function". }
|
|
|
+ Y := Sqrt(X);
|
|
|
+ ClearExceptions(false);
|
|
|
+ except
|
|
|
+ Writeln('silenced exception');
|
|
|
+ { Here I silence eventual exception raised by ClearExceptions.
|
|
|
+ (Yes, I could just do ClearExceptions(false) do achieve the same,
|
|
|
+ but imagine that this is embedded in some complicated code
|
|
|
+ where I really want to raise exception to jump outside
|
|
|
+ in case of problems.) }
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+end.
|