[racket] again: timeouts and exceptions
1. It's right in the docs for call-with-exception-handler:
http://docs.racket-lang.org/reference/exns.html?q=call-with-exception-handler&q=with-handlers#(def._((lib._racket/private/more-scheme..rkt)._call-with-exception-handler))
2. Thanks for the pointer!
----- Original Message -----
From: "Matthias Felleisen" <matthias at ccs.neu.edu>
To: "Rüdiger Asche" <rac at ruediger-asche.de>
Cc: "users" <users at racket-lang.org>
Sent: Thursday, July 05, 2012 8:06 PM
Subject: Re: [racket] again: timeouts and exceptions
1. I don't know where this prose is but it reads rather confusing.
2. If I were you, I'd use an escape continuation rather than an exception
handler here. What you seem to want is flow of control, and let/ec is the
right tool then.
On Jul 5, 2012, at 9:42 AM, Rüdiger Asche wrote:
> Hi there,
>
> a few of you recommended to implement timeouting reads via sync/timeout.
> That works neat, but it would be even nicer to combine this w/ exception
> handling, like so:
>
>
> ...
> ((readbytetimeout)
> (lambda (port)
> (if (sync/timeout READTIMEOUT inport)
> (read-byte inport)
> (raise "read-byte" #t))))
> ...
> ((readsomething) ..... (readbytetimeout) ......
>
>
> (letrec ((repl (lambda ()
> (dosomethingthatmustexecuteperiodically)
> (let ((readresult
> (call-with-exception-handler HandlerFn
> (readsomething))))
> (repl)))))
> (repl))
>
> Iow, I want the REPL to always be operational but restart from the
> beginning when the innermost read timeouts so that the periodic
> computations get their turn.
>
> I didn't get this to work though because according to the docs, "If the
> exception handler returns a value when invoked by raise, then raise
> propagates the value to the “previous” exception handler (still in the
> dynamic extent of the call to raise, and under the same barrier, if any)."
>
> That is true; I get thrown back out of the entire thing because the
> default uncaught exception handler is called. What ectually does it mean
> "IF the
> exception handler..." How is it possible for a function NOT to return a
> value?
> Any return value including #f and () will propagate the exception to the
> default handler; I simply want to stop it where it is.
>
> What do I need to do (or paraphrased: What is the necessary implementation
> of HandlerFn) in order to get this to work? Or do I need yet another
> control flow or handling mechanism?
>
> Thanks!
>
>
>
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users