Smalltalk 为什么零分裂是可恢复的?

Smalltalk 为什么零分裂是可恢复的?,smalltalk,Smalltalk,在法罗语(和其他方言)中,零除异常是可恢复的。为什么?例如,如果您计算1/0,然后继续,则答案是ZeroDivide错误。为什么会这样?ZeroDivide不应该是不可恢复的吗 编辑: 让我们更深入地回顾一下这个问题 这里的问题是,如果发生异常,我们得到的是ZeroDivide异常。因此,我能想到的使此异常恢复的唯一原因是启用以下功能: [a / b] on: ZeroDivide do: [:ex | ex resume: self anythingButTheQuotient], 对吧?

在法罗语(和其他方言)中,
零除
异常是可恢复的。为什么?例如,如果您计算
1/0
,然后继续,则答案是
ZeroDivide
错误。为什么会这样?
ZeroDivide
不应该是不可恢复的吗

编辑: 让我们更深入地回顾一下这个问题

这里的问题是,如果发生异常,我们得到的是
ZeroDivide
异常。因此,我能想到的使此异常恢复的唯一原因是启用以下功能:

[a / b] on: ZeroDivide do: [:ex | ex resume: self anythingButTheQuotient],
对吧?

但这也可以写出来

[a / b] on: ZeroDevide do: [self anythingButTheQuotient]
不要求例外情况是可恢复的

如果存在“有趣的”
#defaultAction
,则可恢复的异常是有意义的。但是
零除法
的情况似乎并非如此

人们可能会说,在许多情况下,人们都有这样的代码:

b = 0 ifTrue: [^0] ifFalse: [^a / b]

那么为什么不使用0作为
#defaultAction
?这将使上述代码更简单(在这些情况下),并且只需要(可以说)少数几个行为必须不同的特殊处理程序。然而,这将是一个非常糟糕的决定,因为默认行为会隐藏错误,正如我们所知,这些错误越晚出现越严重。

是的,乍一看这是令人惊讶的,但ANSI标准说:

零除法异常是可恢复的,因此此协议中的任何消息 这样的异常信号最终可能会返回给发送方

您给出的示例很简单,但是当安装上面几个方法的处理程序时,在发出异常信号的地方恢复异常就不那么简单了

[self doSomethingComplex]
    on: ZeroDivide
    do:
        [:exception |
        "Handle zero divide as inf/nan as if performed in floating point arithmetic"
        exception resume: exception dividend asFloat / 0.0] 
在Squeak或Pharo中,请参见类
异常
中对
信号上下文
实例变量的引用。您将看到,恢复是将控制权返回给信号员的唯一选项