2013-06-23 12 views
5

私が書いているIRCボットについては、UnkownHostExceptionがあっても、ソケットを開こうとしています。私の最初の考えは、このようなものでした。Clojure catchブロックをより機能的に再帰させるにはどうすればよいですか?

(defn open-socket [{:keys [host port] :as connection}] 
    (try (java.net.Socket. host port) 
    (catch java.net.UnknownHostException _ (recur connection)))) 

しかし、キャッチブロックから再発することはできないため、機能しません。代わりに、私はこのようなものに解決しました:

(let [socket (promise) 
     _ (while (not (realized? socket)) 
      (try (deliver socket (java.net.Socket. host port)) 
       (catch java.net.UnknownHostException _))) 
     socket @socket] 
    ... 

これはうまくいかなければなりません。私が見ることができないより機能的な方法がありますか?

答えて

12

だけorを追加します。

(defn open-socket [{:keys [host port] :as connection}] 
    (or (try (java.net.Socket. host port) 
      (catch java.net.UnknownHostException _ nil)) 
     (recur connection))) 
+0

賢いです!ありがとう! – mybuddymichael

0

1つの可能性は、このようなものでしょうか?

(let [make-socket #(try (java.net.Socket. host port) 
        (catch java.new.UnknownHostException _)) 
     socket-attempts (repeatedly make-socket) 
     socket (first (drop-while nil? socket-attempts))] 
    socket) 
関連する問題