[racket] with-handlers string->xexpr fail

From: David Van Horn (dvanhorn at ccs.neu.edu)
Date: Fri Oct 22 17:19:19 EDT 2010

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



Posted on the users mailing list.