5

私が書いている IRC ボットの場合、UnkownHostException. 私の最初の考えは、このようなものでした。

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

しかし、catch ブロックから再帰できないため、機能しません。代わりに、次のようなものに落ち着きました。

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

これは機能しますが、非常に必須です。私が見ることができない、これを行うことができるより機能的な方法はありますか?

4

2 に答える 2

13

を追加するだけorです:

(defn open-socket [{:keys [host port] :as connection}]
  (or (try (java.net.Socket. host port)
           (catch java.net.UnknownHostException _ nil))
      (recur connection)))
于 2013-06-23T07:14:51.013 に答える
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)
于 2013-06-23T05:51:34.063 に答える