mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-16 23:21:57 +02:00
* Added exception testing program
This commit is contained in:
parent
a849740122
commit
910e12b76a
@ -52,3 +52,4 @@ teststr.pp test string functions and speed
|
||||
testaoc.pp test Array of construct.
|
||||
testansi.pp test ansistrings
|
||||
testrtti.pp test RTTI generation and typinfo unit.
|
||||
testexc.pp test exceptions.
|
||||
|
161
tests/testexc.pp
Normal file
161
tests/testexc.pp
Normal file
@ -0,0 +1,161 @@
|
||||
program testexceptions;
|
||||
|
||||
Type
|
||||
TAObject = class(TObject)
|
||||
a : longint;
|
||||
end;
|
||||
TBObject = Class(TObject)
|
||||
b : longint;
|
||||
end;
|
||||
|
||||
Procedure raiseanexception;
|
||||
|
||||
Var A : TAObject;
|
||||
|
||||
begin
|
||||
Writeln ('Creating exception object');
|
||||
A:=TAObject.Create;
|
||||
Writeln ('Raising with this object');
|
||||
raise A;
|
||||
Writeln ('This can''t happen');
|
||||
end;
|
||||
|
||||
Var MaxLevel : longint;
|
||||
|
||||
Procedure DoTryFinally (Level : Longint; DoRaise : Boolean);
|
||||
|
||||
|
||||
Var Raised,Reraised : Boolean;
|
||||
I : Longint;
|
||||
|
||||
begin
|
||||
Try
|
||||
writeln ('Try(',level,') : Checking for exception');
|
||||
If Level=MaxLevel then
|
||||
begin
|
||||
if DoRaise then
|
||||
begin
|
||||
Writeln ('Try(',level,'): Level ',maxlevel,' reached, raising exception.');
|
||||
Raiseanexception
|
||||
end
|
||||
else
|
||||
Writeln ('Try(',Level,'): Not raising exception')
|
||||
end
|
||||
else
|
||||
begin
|
||||
Writeln ('Try(',level,') : jumping to next level');
|
||||
DoTryFinally(Level+1,DoRaise);
|
||||
end;
|
||||
finally
|
||||
Writeln ('Finally (',level,'): Starting code.');
|
||||
end;
|
||||
writeln ('Out of try/finally at level (',level,')');
|
||||
end;
|
||||
|
||||
Procedure DoTryExcept (Level : Longint; DoRaise : Boolean);
|
||||
|
||||
Var Raised : Boolean;
|
||||
I : Longint;
|
||||
Caught : TObject;
|
||||
|
||||
begin
|
||||
Try
|
||||
writeln ('Try(',level,') : Checking for exception');
|
||||
If Level=MaxLevel then
|
||||
if DoRaise then
|
||||
begin
|
||||
Writeln ('Try(',level,'): Level ',maxlevel,', raising exception.');
|
||||
Raiseanexception
|
||||
end
|
||||
else
|
||||
Writeln ('Try(',Level,'): level ',maxlevel,'. Not raising exception')
|
||||
else
|
||||
begin
|
||||
Writeln ('Try(',level,') : jumping to next level');
|
||||
DoTryExcept(Level+1,DoRaise);
|
||||
end;
|
||||
except
|
||||
On TAObject do Writeln ('Exception was caught by TAObject');
|
||||
On TBobject do Writeln ('Exception was caught by TBObject');
|
||||
On E : TObject do Writeln ('Caught object ',E.ClassName);
|
||||
// writeln ('Except (',level,') : Exception caught by default handler');
|
||||
end;
|
||||
writeln ('Out of try/except at level (',level,')');
|
||||
end;
|
||||
|
||||
Procedure DoMix (Level : Longint; DoRaise : Boolean);
|
||||
|
||||
Var Raised : Boolean;
|
||||
I : Longint;
|
||||
Caught : TObject;
|
||||
|
||||
begin
|
||||
Try
|
||||
Try
|
||||
writeln ('Try(',level,') : Checking for exception');
|
||||
If Level=MaxLevel then
|
||||
if DoRaise then
|
||||
begin
|
||||
Writeln ('Try(',level,'): Level ',maxlevel,', raising exception.');
|
||||
Raiseanexception
|
||||
end
|
||||
else
|
||||
Writeln ('Try(',Level,'): level ',maxlevel,'. Not raising exception')
|
||||
else
|
||||
begin
|
||||
Writeln ('Try(',level,') : jumping to next level');
|
||||
DoMix(Level+1,DoRaise);
|
||||
end;
|
||||
finally
|
||||
Writeln ('Mix:Finally (',level,'): Starting code.');
|
||||
end;
|
||||
Writeln ('Level (',level,') : Out of try/finally');
|
||||
except
|
||||
On TAObject do Writeln ('Exception was caught by TAObject');
|
||||
On TBobject do Writeln ('Exception was caught by TBObject');
|
||||
On TObject do writeln ('Except (',level,') : Exception caught by TObject');
|
||||
// The following don't work...
|
||||
On E : TObject do Writeln ('Caught object ',E.ClassName);
|
||||
else
|
||||
writeln ('Except (',level,') : Exception caught by default handler');
|
||||
end;
|
||||
writeln ('Out of try/except at level (',level,')');
|
||||
end;
|
||||
|
||||
Procedure Start(Const Msg : string);
|
||||
|
||||
begin
|
||||
Writeln (Msg);
|
||||
Writeln;
|
||||
end;
|
||||
|
||||
Procedure Finish;
|
||||
|
||||
begin
|
||||
Writeln;
|
||||
Write ('Finished. Press enter to continue.');
|
||||
Readln;
|
||||
end;
|
||||
|
||||
|
||||
begin
|
||||
Maxlevel:=3;
|
||||
Start ('Testing Try/Finally without raise');
|
||||
DoTryFinally (1,False);
|
||||
Finish;
|
||||
Start ('Testing Try/except without raise');
|
||||
DoTryExcept (1,FAlse);
|
||||
Finish;
|
||||
Start ('Testing Mix without raise');
|
||||
DoMix (1,False);
|
||||
Finish;
|
||||
Start ('Testing Try/except with raise');
|
||||
DoTryExcept (1,true);
|
||||
Finish;
|
||||
Start ('Testing Mix with raise');
|
||||
DoMix (1,true);
|
||||
Finish;
|
||||
Writeln ('Testing Try/Finally with raise');
|
||||
Start ('This one should end with an error message !!.');
|
||||
DoTryFinally (1,True);
|
||||
end.
|
Loading…
Reference in New Issue
Block a user