您如何在 smalltalk 中实现 try-catch-finally 习语?我看到有on:do:
和ensure:
,但没有on:do:ensure:
。我肯定错过了什么。
问问题
1877 次
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 回答