testexc.pp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. program testexceptions;
  2. {$mode objfpc}
  3. Type
  4. TAObject = class(TObject)
  5. a : longint;
  6. end;
  7. TBObject = Class(TObject)
  8. b : longint;
  9. end;
  10. Procedure raiseanexception;
  11. Var A : TAObject;
  12. begin
  13. Writeln ('Creating exception object');
  14. A:=TAObject.Create;
  15. Writeln ('Raising with this object');
  16. raise A;
  17. Writeln ('This can''t happen');
  18. end;
  19. Var MaxLevel : longint;
  20. Procedure DoTryFinally (Level : Longint; DoRaise : Boolean);
  21. Var Raised,Reraised : Boolean;
  22. I : Longint;
  23. begin
  24. Try
  25. writeln ('Try(',level,') : Checking for exception');
  26. If Level=MaxLevel then
  27. begin
  28. if DoRaise then
  29. begin
  30. Writeln ('Try(',level,'): Level ',maxlevel,' reached, raising exception.');
  31. Raiseanexception
  32. end
  33. else
  34. Writeln ('Try(',Level,'): Not raising exception')
  35. end
  36. else
  37. begin
  38. Writeln ('Try(',level,') : jumping to next level');
  39. DoTryFinally(Level+1,DoRaise);
  40. end;
  41. finally
  42. Writeln ('Finally (',level,'): Starting code.');
  43. end;
  44. writeln ('Out of try/finally at level (',level,')');
  45. end;
  46. Procedure DoTryExcept (Level : Longint; DoRaise : Boolean);
  47. Var Raised : Boolean;
  48. I : Longint;
  49. Caught : TObject;
  50. begin
  51. Try
  52. writeln ('Try(',level,') : Checking for exception');
  53. If Level=MaxLevel then
  54. if DoRaise then
  55. begin
  56. Writeln ('Try(',level,'): Level ',maxlevel,', raising exception.');
  57. Raiseanexception
  58. end
  59. else
  60. Writeln ('Try(',Level,'): level ',maxlevel,'. Not raising exception')
  61. else
  62. begin
  63. Writeln ('Try(',level,') : jumping to next level');
  64. DoTryExcept(Level+1,DoRaise);
  65. end;
  66. except
  67. On TAObject do Writeln ('Exception was caught by TAObject');
  68. On TBobject do Writeln ('Exception was caught by TBObject');
  69. On E : TObject do Writeln ('Caught object ',E.ClassName);
  70. // writeln ('Except (',level,') : Exception caught by default handler');
  71. end;
  72. writeln ('Out of try/except at level (',level,')');
  73. end;
  74. Procedure DoMix (Level : Longint; DoRaise : Boolean);
  75. Var Raised : Boolean;
  76. I : Longint;
  77. Caught : TObject;
  78. begin
  79. Try
  80. Try
  81. writeln ('Try(',level,') : Checking for exception');
  82. If Level=MaxLevel then
  83. if DoRaise then
  84. begin
  85. Writeln ('Try(',level,'): Level ',maxlevel,', raising exception.');
  86. Raiseanexception
  87. end
  88. else
  89. Writeln ('Try(',Level,'): level ',maxlevel,'. Not raising exception')
  90. else
  91. begin
  92. Writeln ('Try(',level,') : jumping to next level');
  93. DoMix(Level+1,DoRaise);
  94. end;
  95. finally
  96. Writeln ('Mix:Finally (',level,'): Starting code.');
  97. end;
  98. Writeln ('Level (',level,') : Out of try/finally');
  99. except
  100. On TAObject do Writeln ('Exception was caught by TAObject');
  101. On TBobject do Writeln ('Exception was caught by TBObject');
  102. On TObject do writeln ('Except (',level,') : Exception caught by TObject');
  103. // The following don't work...
  104. On E : TObject do Writeln ('Caught object ',E.ClassName);
  105. else
  106. writeln ('Except (',level,') : Exception caught by default handler');
  107. end;
  108. writeln ('Out of try/except at level (',level,')');
  109. end;
  110. function _dotryfinally : boolean;
  111. var
  112. problem : boolean;
  113. begin
  114. result:=false;
  115. try
  116. try
  117. finally
  118. writeln('Raising an exception in finally statement');
  119. Raiseanexception
  120. end;
  121. except
  122. end;
  123. try
  124. exit;
  125. finally
  126. result:=true;
  127. end;
  128. writeln('Problem with finally and exit !!!!');
  129. halt(1);
  130. end;
  131. procedure dotryfinally;
  132. begin
  133. if not(_dotryfinally) then
  134. begin
  135. writeln('Problem with finally and exit !!!!');
  136. halt(1);
  137. end;
  138. end;
  139. Procedure Start(Const Msg : string);
  140. begin
  141. Writeln (Msg);
  142. Writeln;
  143. end;
  144. Procedure Finish;
  145. begin
  146. Writeln;
  147. Write ('Finished.');
  148. { Press enter to continue.');
  149. Readln; tests/test/test... must be non interactive !! PM }
  150. end;
  151. begin
  152. Maxlevel:=3;
  153. Start ('Testing Try/Finally without raise');
  154. DoTryFinally (1,False);
  155. Finish;
  156. Start ('Testing Try/except without raise');
  157. DoTryExcept (1,FAlse);
  158. Finish;
  159. Start ('Testing Mix without raise');
  160. DoMix (1,False);
  161. Finish;
  162. Start ('Testing Try/except with raise');
  163. DoTryExcept (1,true);
  164. Finish;
  165. Start ('Testing Mix with raise');
  166. DoMix (1,true);
  167. Finish;
  168. Start ('Testing Try/Finally with Exit');
  169. dotryfinally;
  170. Finish;
  171. Writeln ('Testing Try/Finally with raise');
  172. Start ('This one should end with an error message !!.');
  173. DoTryFinally (1,True);
  174. end.