我有一台运行AmForth 6.1的ATMega328p。
在交互调试时,我不小心调用了一个未定义的单词,导致AmForth抛出了一个-13
异常(undefined word
)。
抛出异常后,AmForth的行为很奇怪。对预定义单词(如words
)的调用或对简单操作(如1 1 +
)的调用失败。
我找到的唯一解决方案是重新闪存芯片,这显然不太理想。
我是否没有正确处理错误?来自GForth的背景,我习惯于对异常进行持续操作。AmForth似乎不是这样运作的。
在调用未定义的单词后,如何让AmForth正确操作?
以下是使用CATCH
和THROW
:的示例
Throw an exception.
: check 42 throw ;
Call check, and catch any exception.
' check catch .
Should print 42.
我提到QUIT
是因为它是默认的Forth解释器,在AmForth源代码中,它看起来应该捕获异常。也许您正在使用另一个版本的AmForth,或者您没有与标准文本解释器进行交互。
QUIT
刚刚进入Forth文本解释器。它可能看起来很奇怪,但如果你用一个词来称呼它,它是有道理的。无论返回堆栈有多深,QUIT
都会清空它并进入交互模式。然而,它保留了数据堆栈。
: foo 1 2 3 quit ;
: bar foo ;
bar .s Should print 1 2 3.