例外:未绑定不能转换为clojure.lang.Named,编译

时间:2015-04-07 09:12:05

标签: exception-handling clojure

我正在尝试使用clj-http / client来检索网页。看起来它有点工作,但有时我会收到这种异常

  

线程中的异常" main" java.lang.ClassCastException:clojure.lang.Var $ Unbound无法强制转换为clojure.lang.Named,编译:(/ tmp / form-init8570082100332402765.clj:1:72)

这是一个简单的函数,它从数据库中检索url(来自jdbc / query:row-fn),请求url的内容并将其写入数据库。代理数据是随机的,仅供参考。

(defn get-source
  "get content of an url"
  [row]
  (def my-proxy "72.159.148.20")
  (def my-port 10000)
  (def my-url (:url row))
  (def h {"User-Agent" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/34.0"})
  (try
  (def my-body (:body (client/get my-url {:proxy-host my-proxy :proxy-port my-port :follow-redirects false :headers h  :conn-timeout 100000})))
  (catch clojure.lang.ExceptionInfo e
    (prn "caught" e))
    )
  (write-data-to-db my-url my-body))

row的值来自简单的数据库查询:

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (def db-spec
    {
 :subprotocol "mysql"
 :subname "//localhost:3306/a"
 :user "user"
 :password "pass"})
 ((jdbc/query db-spec ["SELECT url FROM main where html is null and url is not null limit 2"] :row-fn get-source)))

感谢您的健康批评,我已经修复了我的榜样以使其更加正确。

    (defn get-source
      "get list of urls to grab in"
      [row]
      (let [proxy "107.161.31.220" port 8080 url (:url row) 
h {"User-Agent" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/34.0"}]
      (:status (client/get url {:proxy-host proxy :proxy-port port :follow-redirects false :headers h  :conn-timeout 100000}))))

我希望这种方式好多了,而且我再也无法得到那个例外,所以它可能被埋没在我最初带来的混乱之中。

1 个答案:

答案 0 :(得分:3)

我认为在Clojure中(或者它只是没有声明)在函数内部或者"阻止"中不是惯用的。 Def声明了全局变量。

来自http://clojure.org/special_forms

  

(def symbol init?)

     

使用symbol的名称和当前名称空间的值的名称空间创建并实习或定位全局var。 < ...> def产生var本身(而不是它的值)。

我猜你必须把(写入数据到数据库)放在try-block中并使用let而不是def。现在你正试图获取可能失败的东西的价值。