smalltalk で try-catch-finally イディオムをどのように実現しますか? on:do:
とがあるように見えますがensure:
、ありませんon:do:ensure:
。私は何かが欠けているに違いない。
1877 次
4 に答える
7
#ensure:がアタッチされている別のブロックで#on:doブロックをラップすることができます。
于 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 に答える