mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 07:43:04 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			39 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
{$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.
 |