在 Oberon 中,异常是通过抛出系统定义的模块 Oberon 异常模块中的异常对象来实现的。如果在程序执行过程中发生了异常,程序就会停止执行,并将处理过程交给异常处理程序。异常处理程序可以对异常进行处理、记录、报告或者继续执行程序。例如:
MODULE Example;
IMPORT Oberon;
PROCEDURE Divide(a, b: INTEGER): INTEGER;
BEGIN
IF b = 0 THEN
Oberon.Raise(Oberon.DivideByZero);
END;
RETURN a DIV b;
END Divide;
VAR a, b: INTEGER;
BEGIN
WRITE("Enter two numbers: ");
READ(a, b);
TRY
WRITE(Divide(a, b));
EXCEPT
ON Oberon.DivideByZero DO
WRITE("Cannot divide by zero");
END;
END;
END Example.
在这个例子中,我们定义了一个名为 Divide 的过程,用于计算两个整数的商。在过程中,我们检查分母是否为 0,如果是,则使用 Oberon.Raise
抛出一个名为 DivideByZero
的异常对象,并由体现在给出的异常处理程序的 ON Oberon.DivideByZero DO
子句中。在异常处理程序中,我们使用 WRITE 输出 Cannot divide by zero
并停止程序运行。
除了异常机制,Oberon 中还支持错误处理和调试。对于错误处理,我们可以在代码中使用 ASSERT,对要求必须满足的条件进行判断,如果条件不满足,则立即停机,输出调试信息,例如:
VAR x: INTEGER;
y: INTEGER;
BEGIN
x := 1;
y := 0;
ASSERT(y # 0, "Cannot divide by zero");
x := x DIV y;
END.
在这个例子中,我们使用 ASSERT 检测除数是否为 0。如果除数为 0,则程序会输出自定义的错误信息 "Cannot divide by zero" 并停止运行。
在调试方面,Oberon 没有自带的调试器,但是可以通过在代码中输出调试信息来进行调试。例如:
MODULE Example;
PROCEDURE Divide(a, b: INTEGER): INTEGER;
BEGIN
IF b = 0 THEN Oberon.Halt(1) END;
RETURN a DIV b;
END Divide;
VAR a, b: INTEGER;
BEGIN
WRITE("Enter two numbers: ");
READ(a, b);
WRITE("Input received, a = ", a, ", b = ", b);
IF b = 0 THEN
WRITE("b cannot be zero!");
ELSE
WRITE("Result: ", Divide(a, b));
END;
END Example.
在这个例子中,我们在代码中加入了大量的 WRITE 语句,输出程序执行的各个阶段和变量的值,从而协助调试。另外,我们还检查了除数是否为 0,如果除数为 0,则使用 Halt(1) 函数停止程序运行。Halt(1) 函数会输出程序结束前的全部 WRITE 语句,因此可以作为打印调试信息的一种方式。