Here's a version with a similar simulated exception but caught in the
main loop, with a bit of tracing code to show the retries.
Clojure 1.2.0
user=> (import java.io.IOException)
java.io.IOException
user=>
user=> (defn some-io-operation []
(let [n (rand-int 30)]
(if (> n 10)
(throw (IOException.))
n)))
#'user/some-io-operation
user=>
user=> (defn loop-with-exception [retries]
(when (pos? retries)
(let [v (try
(print ".")
(some-io-operation)
(catch IOException e e))]
(if (instance? IOException v)
(recur (dec retries))
v))))
#'user/loop-with-exception
user=> (loop-with-exception 10)
..8
On Mar 18, 7:08 am, Daniel Solano Gomez <[email protected]> wrote:
> On Thu Mar 17 21:49 2011, Fiel Cabral wrote:
>
>
>
>
>
> > Hello Clojure users,
> > This is a dumb question but I'd like to write something equivalent to this
> > in Clojure:
>
> > public String loop_with_exception(int retries)
> > {
> > for (int n = retries; n > 0; n--) {
> > try {
> > return some_io_operation();
> > } catch (IOException e) {
> > continue;
> > }
> > }
> > return null;
> > }
>
> > So I tried writing it like this:
>
> > (ns sandbox.core
> > (:import [java.io.IOException]))
>
> > (defn some-io-operation
> > "Some read I/O operation that could throw an IOException."
> > []
> > (println "WOULD do a read operation"))
>
> > (defn loop-with-exception [retries]
> > (loop [n retries]
> > (try
> > (when (pos? n)
> > (some-io-operation))
> > (catch IOException e
> > (recur (dec n))))))
>
> > What's the recommended way to handle exceptions and retry inside a
> > loop/recur?
>
> Well, I'm not sure what's the best recommendation, but playing around
> with it a bit, it seems like moving the exception-handling into the IO
> method works best. Doing this, you can have different return values
> depending on whether the operation succeeded.
>
> Here's what I came up with:
>
> (defn some-io-operation
> "Some read I/O operation that may fail. Returns nil on failure,
> ::success on success."
> []
> (try
> (when (zero? (rand-int 3))
> (throw (IOException.)))
> ; return non-nil and non-false on success
> ::success
> (catch IOException e
> ; return nil on failure
> nil)))
>
> (defn loop-with-exception [retries]
> (first (remove nil? (repeatedly retries some-io-operation))))
>
> I am not absolutely certain the loop-with-exception function is the best
> implementation, but I believe it works correctly.
>
> Sincerely,
>
> Daniel Solano Gómez
>
> application_pgp-signature_part
> < 1KViewDownload- Hide quoted text -
>
> - Show quoted text -
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en