2013-07-07 2 views
2

Я использую следующий код Clojure для обертывания .ping из riak-java-client. Но я не люблю, это тупой ловлей исключение:Захват конкретного исключения из riak-java-client от Clojure

(ns myapp.riak 
    (:import [com.basho.riak.client IRiakClient])) 

(set! *warn-on-reflection* true) 

(defn alive? 
    "Is Riak client alive? Returns true or false, unlike `.ping`." 
    [^IRiakClient client] 
    (try 
    (.ping client) true 
    (catch Exception e false))) 

Я попытался поймать их:

  • com.basho.riak.client.RiakException
  • java.net.ConnectException
  • java.io.IOException

Но ни один из них (отдельно или в комбинации).

Что я делаю неправильно?

3:56 pm EDT update: Я использую RiakFactory/httpClient, в случае, если это имеет значение.

4:13 pm EDT update: Одним из интересных аспектов является процесс отладки. Во время отладки в REPL появился ConnectException. Но RiakIORuntimeException - часть решения ниже - не отображалась. Интересно, почему нет.

ответ

2

пинг бросает RiakException - https://github.com/basho/riak-java-client/blob/master/src/main/java/com/basho/riak/client/DefaultRiakClient.java#L210

Следующая функция работает для меня. Я не установлен Riak и возвращает ложные

(ns riak.core 
    (:import [com.basho.riak.client IRiakClient RiakFactory RiakException] 
      [com.basho.riak.client.http.response RiakIORuntimeException])) 

(set! *warn-on-reflection* true) 
;; (def client (RiakFactory/pbcClient)) 
(def client (RiakFactory/httpClient)) 

(defn alive? 
    "Is Riak client alive? Returns true or false, unlike `.ping`." 
    [^IRiakClient client] 
    (try 
    (.ping client) 
    true 
    (catch RiakException e false) 
    (catch RiakIORuntimeException e false))) 

REPL:

riak.core> (alive? client) 
false 

UPDATE: Добавлено RiakIORuntimeException случай для HTTPClient

Смежные вопросы