9

let同じfinallyブロックを使用して、バインディングまたはステートメントの本体で発生する可能性のある例外をどのように処理しますか? 元:

(let [connections (create-connections)] 
  (dostuff)
  (close connections))

(create-connections)または失敗した場合(dostuff)、私はしたいです(close connections)。いくつかのオプション:

オプション1:

(try     
  (let [connections (create-connections)] 
    (dostuff))
  (finally (close connections))

connectionsfinally ブロックの範囲内にないため、これは明らかに機能しません。

オプション 2:

(let [connections (create-connections)]
  (try
    (dostuff)
    (finally (close connections)))

このオプションは、(destuff)コールで発生した例外のみを捕捉し、 で発生した例外は捕捉しません(create-connections)

オプション 3:

(let [connections (try 
                    (create-connections)
                    (finally (close connections)))]
  (try
    (dostuff)
    (finally (close connections)))

connectionslet バインディング内の finally ステートメントのスコープ外であるため、これも機能しません。

それで、これに対処する最善の方法は何ですか?

4

1 に答える 1

11

ビルトインは、with-open呼び出すことができるものなら何でも動作する.closeため、通常のアプローチは次のようなものを使用することです。

(with-open [connections (create-connections)] 
    (do-stuff connections))

接続を開くことができなかったコード内の接続を開くエラーを処理します。create-connections が接続の 1 つを開くことができない場合、おそらくcreate-connections 内のtry...ブロックは、その種のエラー状態を処理するためのよりクリーンな場所です。finally

于 2013-12-02T19:09:08.780 に答える