2013-06-23 19 views
5

Đối với một bot IRC tôi đang viết, tôi muốn tiếp tục cố gắng để mở một ổ cắm, ngay cả khi có một UnkownHostException. Suy nghĩ đầu tiên của tôi là một cái gì đó như thế này.Làm thế nào tôi có thể tái phát từ một khối catch Clojure một cách chức năng hơn?

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

Nhưng nó không hoạt động vì bạn không thể tái phát từ khối bắt. Vì vậy, thay vào đó tôi đã giải quyết một việc như thế này:

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

Và điều này hoạt động, nhưng nó cực kỳ cấp thiết. Có cách nào có chức năng hơn tôi có thể làm điều này mà tôi không thể nhìn thấy?

Trả lời

12

Chỉ cần thêm một or:

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

Clever! Cảm ơn! – mybuddymichael

0

Một khả năng có thể giống như thế này?

(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) 
Các vấn đề liên quan