To make the program concrete, suppose we have "a.rkt" as #lang racket/base
(define (epipe? x) (and (exn:fail:filesystem:errno? x) (equal? '(32 . posix) (exn:fail:filesystem:errno-errno x)))) (define (epipe-handler x) "ignore") (with-handlers ([epipe? epipe-handler]) (let loop () (displayln "hi") (loop))) and then we run racket a.rkt | more and then we hit "q" to exit `more`. In that case, we will get error writing to stream port system error: Broken pipe; errno=32 The problem is that `epipe-handler` returns a string that becomes the result of the whole `with-handlers`. When Racket attempts to print that string, it fails (outside the `with-handlers`, of course). In other words, the exception reports the failure to print "ignore", not a failure from `(displayln "hi")`. In this little example, changing `epipe-handler` to (define (epipe-handler x) (void)) avoids the problem, because a void result isn't printed. Another solution is (define (epipe-handler x) (exit 0)) to immediately exit, instead of returning a value. At Fri, 12 Sep 2014 21:57:30 +0200, Wolfgang Hukriede wrote: > Hi Matthias, nice to meet you! Yes, this was what I was looking for. > > For the records: > > (define (epipe? x) > (and > (exn:fail:filesystem:errno? x) > (equal? '(32 . posix) (exn:fail:filesystem:errno-errno x)))) > > (define (epipe-handler x) > "ignore") > > (with-handlers > ((epipe? epipe-handler)) > transput...) > > Many thanks! > > Results are mixed though. Usage like > > $ mzscheme --no-init-file --load pipetest.scm | head > > mostly works okay, but depending on how and how much is written to > standard out and on the parameters to "head" failures reproducibly > occur: in some situations the signal is not caught, yielding a "system > error: Broken pipe; errno=32" message (versions 6.1 and 5.93 on > freebsd, and 4.1 on generic linux, 6.1 precompiled racket on > archlinux), or sometimes the pipe even just hangs (6.1 on freebsd). > These were the combinations I tried. > (On 4.1 exn:fail:filesystem was used instead of non-existing > exn:fail:filesystem:errno.) > ____________________ > Racket Users list: > http://lists.racket-lang.org/users ____________________ Racket Users list: http://lists.racket-lang.org/users