6

您如何在 smalltalk 中实现 try-catch-finally 习语?我看到有on:do:ensure:,但没有on:do:ensure:。我肯定错过了什么。

4

4 回答 4

7

您可以将#on:do 块包装在另一个带有#ensure: 的块中。

于 2011-10-20T19:48:38.187 回答
5

如果你真的需要它,你可以给 BlockClosure 添加一个协议:

#on: anErrorOrSet do: errorBlock ensure: finallyBlock
    [ self on: anErrorOrSet do: errorBlock ]
    ensure: finallyBlock

它的行为就像 java 上的 try:catch:finally: 一样。

这就是 smalltalk 的魔力(嗯,它的一小部分),如果无法满足您的需求,您可以随时扩展它 :)

于 2011-10-21T11:52:39.623 回答
1

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

[self doWhatever] on: SomeException do: [self handleSomeException].
self continueNormally.

查看 Exception 的所有子类,看看您可以捕获哪些类型的异常。

希望它有所帮助!

于 2011-10-21T08:28:20.353 回答
1

这就是您可以在几乎所有 Smalltalk 方言中开箱即用地编写它的方式。

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

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

于 2011-10-21T14:23:08.010 回答