123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- { %RESULT=217 }
- program testexceptions;
- {$mode objfpc}
- 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;
- function _dotryfinally : boolean;
- var
- problem : boolean;
- begin
- result:=false;
- try
- try
- finally
- writeln('Raising an exception in finally statement');
- Raiseanexception
- end;
- except
- end;
- try
- exit;
- finally
- result:=true;
- end;
- writeln('Problem with finally and exit !!!!');
- halt(1);
- end;
- procedure dotryfinally;
- begin
- if not(_dotryfinally) then
- begin
- writeln('Problem with finally and exit !!!!');
- halt(1);
- end;
- end;
- Procedure Start(Const Msg : string);
- begin
- Writeln (Msg);
- Writeln;
- end;
- Procedure Finish;
- begin
- Writeln;
- Write ('Finished.');
- { Press enter to continue.');
- Readln; tests/test/test... must be non interactive !! PM }
- 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;
- Start ('Testing Try/Finally with Exit');
- dotryfinally;
- Finish;
- Writeln ('Testing Try/Finally with raise');
- Start ('This one should end with an error message !!.');
- DoTryFinally (1,True);
- end.
|