6

smalltalk で try-catch-finally イディオムをどのように実現しますか? on:do:とがあるように見えますがensure:、ありませんon:do:ensure:。私は何かが欠けているに違いない。

4

4 に答える 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 に答える