texception1.pp 4.5 KB

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