Я пытаюсь выполнить func несколько раз, прежде чем отказаться от исключений. Но это недействительно в Clojure, чтобы вернуться из блока catch. Как это можно достичь?Clojure: Как вернуться к исключению?
(loop [tries 10]
(try
(might-throw-exception)
(catch Exception e
(when (pos? tries) (recur (dec tries))))))
java.lang.UnsupportedOperationException: Cannot recur from catch/finally
Лучшим, что я смог найти следующее неуклюжее решение (обертывание в FUNC и назвав его)
(defn do-it []
(try
(might-throw-exception)
(catch Exception e nil)))
(loop [times 10]
(when (and (nil? (do-it)) (pos? times))
(recur (dec times))))
Это прекрасное решение. Я бы добавил его к clojure.contrib или что-то в этом роде. – GabiMe
На самом деле это то же самое решение, что и предложенный плакат. Но макросы упрощают работу в общем случае. Макросы - это функция убийцы любого варианта lisp. –
Это не совсем то же самое решение. Предложение плаката не улавливает возвращаемое значение блока, и если бы он сделал блок, он не смог бы вернуть нуль. Также исключения проглатываются. Но вы правы: это в основном та же идея. Макросы просто скрывают шаблон. – kotarak