MODULE TExceptLib; (* M3: EXCEPTIONS / M2EXCEPTION over user RAISE and SYSTEM.THROW. *) FROM EXCEPTIONS IMPORT ExceptionSource, ExceptionNumber, AllocateSource, RAISE, CurrentNumber, GetMessage, IsCurrentSource, IsExceptionalExecution; FROM M2EXCEPTION IMPORT M2Exception, IsM2Exception, wholeDivException, exException; FROM SYSTEM IMPORT THROW; VAR ExitCode : INTEGER; VAR src : ExceptionSource; VAR other : ExceptionSource; VAR msg : ARRAY [0..63] OF CHAR; VAR n : ExceptionNumber; PROCEDURE UserRaise; BEGIN RAISE(src, 7, "boom"); ExitCode := 1 EXCEPT IF IsExceptionalExecution() AND IsCurrentSource(src) AND NOT IsCurrentSource(other) AND NOT IsM2Exception() AND (CurrentNumber(src) = 7) THEN GetMessage(msg); IF msg = "boom" THEN ExitCode := 42 ELSE ExitCode := 2 END ELSE ExitCode := 3 END END UserRaise; PROCEDURE AskWrongSource; BEGIN n := CurrentNumber(other); ExitCode := 1 EXCEPT IF IsM2Exception() AND (M2Exception() = exException) THEN ExitCode := 42 ELSE ExitCode := 6 END END AskWrongSource; PROCEDURE LanguageRaise; BEGIN THROW(6) EXCEPT IF IsM2Exception() AND (M2Exception() = wholeDivException) THEN ExitCode := 42 ELSE ExitCode := 4 END END LanguageRaise; BEGIN AllocateSource(src); AllocateSource(other); ExitCode := 0; UserRaise; IF ExitCode = 42 THEN GetMessage(msg); IF msg = "" THEN ExitCode := 0 ELSE ExitCode := 5 END END; IF ExitCode = 0 THEN AskWrongSource END; IF ExitCode = 42 THEN LanguageRaise END END TExceptLib.