[racket] with-handlers string->xexpr fail
On 10/22/10 5:12 PM, scouic wrote:
> Hi,
> i learn with-handlers mechanism, and i don't understand what's wrong in
> this piece of code ?
>
> #lang racket
> (require xml)
>
> (define a-good-string "<doc><bold>hi</bold> there!</doc>")
> (define a-bad-string "<doc><boooooold>hi</bold> there!</doc>")
>
> (define (panoramix s)
> (with-handlers ((exn:invalid-xexpr? (lambda (e) 'UFO)))
> (string->xexpr s)))
>
> (panoramix a-good-string)
> ; this is ok and returns > '(doc () (bold () "hi") " there!")
>
> (panoramix a-bad-string)
> ; <unsaved editor>::6: read-xml: parse-error: start tag `boooooold' at
> [1.5/6 1.16/17] doesn't match end tag `bold' at [1.18/19 1.25/26]
>
> Why it returns an error and not UFO ?
Because the exception raised is not a value that answers true to
exn:invalid-xexpr?. If you change the program to this, you can see what
is raised:
(define (panoramix s)
(with-handlers (((lambda (x) true) (lambda (e) e)))
(string->xexpr s)))
which is:
(exn:xml
"read-xml: parse-error: start tag `boooooold' at [1.5/6 1.16/17]
doesn't match end tag `bold' at [1.18/19 1.25/26]"
#<continuation-mark-set>
(list (srcloc 'string #f #f 6 11) (srcloc 'string #f #f 19 7))
...)
The problem is not in converting XML to an Xexpr, but rather in reading
XML from a string. If you change the predicate to exn:xml? it will work
as you expected.
(define (panoramix s)
(with-handlers ((exn:xml? (lambda (e) 'UFO)))
(string->xexpr s)))
David