Próbuję wykonać func kilka razy przed rezygnacją z wyjątków. Ale nie jest ważne w Clojure, aby powrócić z bloku catch. Jak można to osiągnąć?Clojure: Jak powtórzyć po wyjątku?
(loop [tries 10]
(try
(might-throw-exception)
(catch Exception e
(when (pos? tries) (recur (dec tries))))))
java.lang.UnsupportedOperationException: Cannot recur from catch/finally
Najlepszą udało mi się znaleźć jest następujące rozwiązanie niezdarny (zawijania w func i wzywającą go)
(defn do-it []
(try
(might-throw-exception)
(catch Exception e nil)))
(loop [times 10]
(when (and (nil? (do-it)) (pos? times))
(recur (dec times))))
Jest dobre rozwiązanie. Dodałbym go do clojure.contrib lub coś podobnego. – GabiMe
To właściwie to samo rozwiązanie, które sugerował plakat. Ale makra ułatwiają to w ogólnym przypadku. Makra są zabójcą każdego wariantu seplenienia. –
To nie jest dokładnie to samo rozwiązanie. Sugestia plakatu nie przechwytuje wartości zwracanej bloku, a jeśli tak, blok nie będzie w stanie zwrócić zero. Również wyjątki są połknięte. Ale masz rację: to w zasadzie ten sam pomysł. Makra po prostu ukrywają płytę główną. – kotarak