HANDLER-BIND中处理器拒绝处理信号的含义及信号处理动作问询
关于Common Lisp中处理器处理信号的疑问解答
一、什么是处理器的“正常返回”与“非正常返回”
根据HyperSpec的定义,处理器的正常返回指的是处理器函数完整执行完毕,没有触发任何终止信号分发流程的操作,此时系统会继续寻找后续的处理器,就像当前处理器不存在一样——这就是所谓的“拒绝(decline)处理信号”。
而非正常返回则是指处理器执行了某种操作,直接终止了当前的信号分发流程,系统不再尝试调用后续处理器,这就意味着处理器完成了“处理信号”的动作。
二、处理信号的完整动作列表(除INVOKE-RESTART外的其他方式)
INVOKE-RESTART确实是最常用的处理信号的方式,但绝非唯一,以下是其他常见的处理信号的动作:
- 使用
RETURN-FROM跳出信号上下文:如果信号是在某个块(block)内触发的,处理器可以通过return-from直接跳转到该块的结束位置,终止信号分发流程,让程序从块之后继续执行。 - 调用
ABORT或其他终止型重启:ABORT是Common Lisp的标准重启之一,调用它会终止当前的计算流程,直接回到顶层环境,这显然属于处理了触发的信号。 - 抛出新的条件:在处理器中抛出另一个条件(比如用
ERROR或SIGNAL),会替换当前的信号分发流程,原信号的处理被终止,系统转而处理新的条件——这也算是完成了对原信号的处理。 - 直接终止程序:比如调用
QUIT或类似的实现相关函数终止程序,虽然极端,但确实终止了原信号的处理流程,属于处理信号的一种方式。
核心判断标准是:只要处理器的操作导致系统不再继续分发当前信号给后续处理器,就属于“处理信号”。
内容的提问来源于stack exchange,提问作者shadowtalker
相关产品推荐
相关产品推荐

