我有几个操作需要进行线程处理,每个操作都可能失败。我更希望将错误作为值返回,而不是使用try-catch来打断执行流程。
我可以采用简单的方法,使我的函数在失败时使用nil:
(if-let (op1 ...)
(if-let (op2 ...)
...
err1)
err2)
但这是嵌套的,使得阅读更加困难。
我可以使用some->
,这似乎是最接近的解决方案,但它没有说明失败的原因:
(if-let [res (some-> arg
op1
op2)]
res
somethin-failed) ;; what failed though?
我也看了->
和cond->
,但它们似乎没有帮助。
我知道有在线宏可以做这些事情,但如果存在解决此问题的方法,我宁愿不添加宏。希望有类似以下形式的东西:
(some-with-err-> arg
op1 err1
op2 err2
...)
我可能忽略了更简单的方法,但似乎找不到内置的解决方案。
我可以编写一个宏来解决这个问题,但现在宁愿避免使用它。