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中,请参见类异常
中对信号上下文
实例变量的引用。您将看到,恢复是将控制权返回给信号员的唯一选项