Dear guile users, When an exception is raised with #:continuable?, and when the handler returns a value, then the program continues. This is why this program prints "hello": (use-modules (ice-9 exceptions)) (with-exception-handler (lambda (exn) ;; We want to return "hello" "hello\n") (lambda () (format (current-error-port) (raise-exception (make-exception-with-message "What should I say?") #:continuable? #t)))) Now, in the handler, I may want to handle other kinds of exceptions: (use-modules (ice-9 exceptions)) (with-exception-handler (lambda (exn) ;; We want to return "hello" (false-if-exception ;; Shouldn’t this error be ignored? (error "messing around")) "hello\n") (lambda () (format (current-error-port) (raise-exception (make-exception-with-message "What should I say?") #:continuable? #t)))) Is this a bug? Best regards, Vivien
[-- Attachment #1: Type: text/plain, Size: 354 bytes --] Hi, This also happens without #:continuable?. Here's a simpler test case: (with-exception-handler (lambda (exn) (catch #t (lambda () (error "to be caught")) (lambda e (pk 'caught! e)))) (lambda () (error "oops"))) ---> In procedure raise-exceptiont: to be caught I don't know if this is a bug. Greetings, Maxime. [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 260 bytes --]
Hello, I finally figured it out:
Le mercredi 25 août 2021 à 21:08 +0200, Maxime Devos a écrit :
> This also happens without #:continuable?.
> Here's a simpler test case:
>
> (with-exception-handler
> (lambda (exn)
> (catch #t
> (lambda () (error "to be caught"))
> (lambda e (pk 'caught! e))))
> (lambda () (error "oops")))
> ---> In procedure raise-exceptiont: to be caught
>
> I don't know if this is a bug.
It is not, it was in the documentation the whole time. The effective
handler is the outmost handler, unless #:unwind? is #t. I was tricked
by the obscure scheme jargon, but this works as expected:
(with-exception-handler
(lambda (exn)
(catch #t
(lambda () (error "to be caught"))
(lambda e (pk 'caught! e))))
(lambda () (error "oops"))
#:unwind? #t)