[racket] with-handlers and exception structure
To add to what Matthew and Danny said, in addition to using
`exn-message' you can show a "stack trace" if you wish. For example:
(define (exn->string exn)
(string-append "Exception: " (exn-message exn)))
(define (exn+stack->string exn)
(string-append (exn->string exn) "\n"
"Stack:\n"
(stack-trace-string exn)))
(define (stack-trace-string exn)
(string-join
(map (lambda (x)
(format "'~a' ~a ~a"
(if (car x) (car x) "")
(if (cdr x) (srcloc-source (cdr x)) "")
(if (cdr x) (srcloc-line (cdr x)) "")))
(continuation-mark-set->context (exn-continuation-marks exn)))
"\n"))
;; Example usage:
(with-handlers ([exn:fail? (compose1 displayln exn+stack->string)])
(/ 1 0))
On Mon, Sep 3, 2012 at 10:56 AM, Danny Yoo <dyoo at hashcollision.org> wrote:
>
>
> On Monday, September 3, 2012, Gregory Woodhouse wrote:
>>
>> Dumb question: If an exception is handled by (lambda (e) ... ) is it
>> possible to recover exception details such as any message that may have been
>> used in a raise or related statement?
>
>
> Hi Gregory,
>
> The value raised by exceptions should be structured; in most cases, the
> exception value will be an instance of the exn:fail struct. Take a look at
> http://docs.racket-lang.org/reference/exns.html#(part._.Built-in_.Exception_.Types)
> for the definition of the exn struct. The exn-message function, in
> particular, should let you select out the string message associated to the
> raised exception.
>
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users
>