gpt4 book ai didi

clojure - 在 core.async 中处理错误和超时的更优雅的方法?

转载 作者:行者123 更新时间:2023-12-03 03:22:46 25 4
gpt4 key购买 nike

当然,我想使用 core.async 包装对外部服务的各种请求,同时仍然通过一些 chan 返回这些操作的结果。

我想要处理抛出的异常和超时(即操作返回时间比预期更长,或者能够在同一任务的各种服务中进行选择,但具有不同的方法或服务质量。

展示能够处理错误、超时和正确返回结果的示例的最小可行示例似乎是:

(require '[clojure.core.async :refer [chan go timeout <! >! alt!]])

(def logchan (chan 1))

(go (loop []
(when-let [v (<! logchan)]
(println v)
(recur))))

(dotimes [_ 10]
(go
(let [result-chan (chan 1)
error-chan (chan 1)
timeout-chan (timeout 100)]
(go
(try
(do (<! (timeout (rand-int 200)))
(>! result-chan (/ 1 (rand-int 2))))
(catch Exception e (>! error-chan :error))))
(>! logchan (alt! [result-chan error-chan timeout-chan]
([v] (if v v :timeout)))))))

此代码打印类似内容

1
:error
1
:error
:error
:timeout
:error
:timeout
:timeout

这不是很优雅。我特别不喜欢返回 :error:timeout 的方式。 alt! 中的 nil-check 显然也不是我想要的。

有没有更好的方法来实现返回结果防止长时间超时处理错误这三个目标?语法相当不错(上面的大多数内容实际上都是为了引发这三个错误)。

最佳答案

core.async chan 函数具有前处理程序,因此以下构造是可能的

(chan buf-or-n xform ex-handler)

其中 ex-handler 是一个获取异常的单参数函数。当函数返回 nil 时,不会将其放入 channel ,否则函数有机会将异常转换为对相关数据可行的内容。

关于clojure - 在 core.async 中处理错误和超时的更优雅的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26487118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com