Dan Liebgold wrote on 02/16/2017 02:33 PM:
How can I rewrite this so that it either eats the exception or is atomic?
I think the difficulty here is that you don't know for certain why a
`make-directory` failed, so maybe conditionally re-raising the exception
is the way:
(define (make-directory-if-does-not-exist dir)
(or (directory-exists? dir)
(with-handlers ((exn:fail:filesystem?
(lambda (exn)
(if (directory-exists? dir)
;; make-directory exception, but directory
exists
;; now, so assume all is OK.
(void)
;; make-directory exception, but directory
does
;; NOT exist, so re-raise the exception.
(raise exn)))))
(make-directory dir))))
(make-directory-if-does-not-exist "/tmp/my-dir")
BTW, the first `directory-exists?` call is not functionally necessary,
but (since the exact low-level behavior is unspecified) a general rule
of thumb is that it's gentler to do read first, when that might preclude
having to do a write. And you only do the second `directory-exists?` if
you already had to do a likely more expensive `make-directory`.
--
You received this message because you are subscribed to the Google Groups "Racket
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.