Error handling 试着在smalltalk中使用catch finally这个成语

Error handling 试着在smalltalk中使用catch finally这个成语,error-handling,smalltalk,try-catch-finally,Error Handling,Smalltalk,Try Catch Finally,你是如何在smalltalk中实现try-catch-finally成语的?我看到在:do:和确保:上有,但在:do:sure:上没有。我肯定遗漏了什么。您可以将#on:do块包装在另一个附加了#sure:的块中。我不确定我是否理解了您的问题,但如果我理解了,您的意思是“如果触发异常,如何处理异常,否则如何继续正常执行”,那么您可以这样做: [self doWhatever] on: SomeException do: [self handleSomeException]. self conti

你是如何在smalltalk中实现try-catch-finally成语的?我看到在:do:和
确保:
上有
,但在:do:sure:
上没有
。我肯定遗漏了什么。

您可以将#on:do块包装在另一个附加了#sure:的块中。

我不确定我是否理解了您的问题,但如果我理解了,您的意思是“如果触发异常,如何处理异常,否则如何继续正常执行”,那么您可以这样做:

[self doWhatever] on: SomeException do: [self handleSomeException].
self continueNormally.
查看Exception的所有子类,看看您可以捕获哪些类型的异常


希望有帮助

如果您确实需要它,您可以向BlockClose添加协议:

#on: anErrorOrSet do: errorBlock ensure: finallyBlock
    [ self on: anErrorOrSet do: errorBlock ]
    ensure: finallyBlock
这与java上的try:catch:finally:一样


这就是smalltalk的神奇之处(好吧,它的一小部分),如果没有适合你的需求,你可以随时扩展它:)

这就是你可以用几乎所有smalltalk方言开箱即写的方法

[[ "try{}" ] 
    on: Error 
    do: [:ex | "catch{}"]]
        ensure: ["finally{}"]

或者您可以按照@EstebanLM的建议扩展BlockClosure。

Ah确实如此。我想到了它,但不知怎的,我认为它会执行内部块两次,因为#on:do:和#sure:send#value。
#sure:
的send of
#value
将评估其内容,这将把
#on:do:
发送到其内容,然后将
#value
发送到最内部的块,最终会做一些有用的事情。换句话说,两个
#value
发送被发送到不同的块。finally块不仅在执行正常继续时执行,而且在异常像Smalltalk一样展开堆栈时也会执行。请参阅其他答案。