如何在Clojure的try-catch循环中返回值?(Socket重试场景)
解决Clojure循环重试并返回成功结果的问题
原代码返回nil的原因是:when-not只会在它的测试表达式为假时执行recur,而你的try块返回的6是真值,所以when-not不会触发循环,但整个loop表达式在执行完when-not后没有显式返回任何值,最终默认返回nil。
要实现“成功时返回结果,失败则重试”的逻辑,直接调整loop内的结构,让成功的分支直接返回结果,异常分支触发重试即可:
(loop [] (try ;; 这里替换成实际创建Socket的逻辑 6 (catch Exception e (.println *err* (str e)) (recur))))
这段代码的逻辑是:
- 每次进入循环,先执行
try块里的代码(创建Socket或返回6) - 如果执行成功,直接返回该结果(6或创建好的Socket),循环结束
- 如果抛出异常,打印错误信息后调用
recur重新执行循环
测试这段代码会直接返回6,完全符合需求。
内容的提问来源于stack exchange,提问作者Samuel Squire
相关产品推荐
相关产品推荐

