t_except_lib.mod 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. MODULE TExceptLib;
  2. (* M3: EXCEPTIONS / M2EXCEPTION over user RAISE and SYSTEM.THROW. *)
  3. FROM EXCEPTIONS IMPORT
  4. ExceptionSource, ExceptionNumber, AllocateSource, RAISE,
  5. CurrentNumber, GetMessage, IsCurrentSource, IsExceptionalExecution;
  6. FROM M2EXCEPTION IMPORT
  7. M2Exception, IsM2Exception, wholeDivException, exException;
  8. FROM SYSTEM IMPORT THROW;
  9. VAR ExitCode : INTEGER;
  10. VAR src : ExceptionSource;
  11. VAR other : ExceptionSource;
  12. VAR msg : ARRAY [0..63] OF CHAR;
  13. VAR n : ExceptionNumber;
  14. PROCEDURE UserRaise;
  15. BEGIN
  16. RAISE(src, 7, "boom");
  17. ExitCode := 1
  18. EXCEPT
  19. IF IsExceptionalExecution() AND IsCurrentSource(src)
  20. AND NOT IsCurrentSource(other)
  21. AND NOT IsM2Exception() AND (CurrentNumber(src) = 7) THEN
  22. GetMessage(msg);
  23. IF msg = "boom" THEN ExitCode := 42 ELSE ExitCode := 2 END
  24. ELSE
  25. ExitCode := 3
  26. END
  27. END UserRaise;
  28. PROCEDURE AskWrongSource;
  29. BEGIN
  30. n := CurrentNumber(other);
  31. ExitCode := 1
  32. EXCEPT
  33. IF IsM2Exception() AND (M2Exception() = exException) THEN
  34. ExitCode := 42
  35. ELSE
  36. ExitCode := 6
  37. END
  38. END AskWrongSource;
  39. PROCEDURE LanguageRaise;
  40. BEGIN
  41. THROW(6)
  42. EXCEPT
  43. IF IsM2Exception() AND (M2Exception() = wholeDivException) THEN
  44. ExitCode := 42
  45. ELSE
  46. ExitCode := 4
  47. END
  48. END LanguageRaise;
  49. BEGIN
  50. AllocateSource(src);
  51. AllocateSource(other);
  52. ExitCode := 0;
  53. UserRaise;
  54. IF ExitCode = 42 THEN
  55. GetMessage(msg);
  56. IF msg = "" THEN ExitCode := 0 ELSE ExitCode := 5 END
  57. END;
  58. IF ExitCode = 0 THEN AskWrongSource END;
  59. IF ExitCode = 42 THEN LanguageRaise END
  60. END TExceptLib.