簡體   English   中英

為什么ZeroDivide可以恢復?

[英]Why ZeroDivide is resumable?

在Pharo(和其他方言)中, ZeroDivide例外可以ZeroDivide 為什么?。 舉例來說,如果你評估1 / 0然后繼續,答案是ZeroDivide錯誤。 為什么是這樣? ZeroDivide不應該不可ZeroDivide嗎?

編輯 :讓我們更深入地回顧這個問題。

這里的問題是如果異常發生,我們得到的是ZeroDivide異常。 因此,我可以考慮使此異常可恢復的唯一原因是啟用以下內容:

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

對?

但這也可以寫出來

[a / b] on: ZeroDevide do: [self anythingButTheQuotient]

不要求例外可以恢復。

如果存在“有趣的” #defaultAction則可恢復的異常是有意義的。 ZeroDivide似乎並非ZeroDivide

有人可能會說,在許多情況下,人們會有這樣的代碼:

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中,請參閱Exception類中對signalContext實例變量的引用。 您將看到恢復是將控制權返回給信號器的唯一選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM