Hello Ricardo, Ricardo Wurmus <rek...@elephly.net> writes:
> Hi Maxim, > >> When raising a srfi-35 defined exception type like in the following, a >> generic (and unhelpful) "Error while printing exception" message is >> shown, with not even the exception type mentioned: >> >> (use-modules (srfi srfi-35)) >> >> (define-condition-type &platform-not-found-error &error >> platform-not-found-error?) >> >> (raise-exception &platform-not-found-error) >> >> >> Produces: >> >> Backtrace: >> In ice-9/boot-9.scm: >> 1752:10 5 (with-exception-handler _ _ #:unwind? _ # _) >> In unknown file: >> 4 (apply-smob/0 #<thunk 7f236157a2e0>) >> In ice-9/boot-9.scm: >> 724:2 3 (call-with-prompt _ _ #<procedure default-prompt-handle…>) >> In ice-9/eval.scm: >> 619:8 2 (_ #(#(#<directory (guile-user) 7f2361580c80>))) >> In ice-9/boot-9.scm: >> 2836:4 1 (save-module-excursion _) >> 4388:12 0 (_) >> >> ice-9/boot-9.scm:4388:12: Error while printing exception. >> >> This is probably not by design, right? > > Perhaps not, but conditions are expected to be raised with “raise”: > > (use-modules (srfi srfi-34) (srfi srfi-35)) > > (define-condition-type &platform-not-found-error &error > platform-not-found-error?) > > (raise (condition (&platform-not-found-error))) > ice-9/boot-9.scm:1685:16: In procedure raise-exception: > ERROR: > 1. &platform-not-found-error Thanks for pointing that. The above with 'raise' doesn't produce the same output for my Guile 3.0.8: --8<---------------cut here---------------start------------->8--- (use-modules (srfi srfi-35)) (define-condition-type &platform-not-found-error &error platform-not-found-error?) (raise (condition (&platform-not-found-error))) ice-9/boot-9.scm:1685:16: In procedure raise-exception: Wrong type (expecting exact integer): #<&platform-not-found-error> --8<---------------cut here---------------end--------------->8--- Using 'raise-exception' instead of 'raise' fixes it for me: --8<---------------cut here---------------start------------->8--- (raise-exception (condition (&platform-not-found-error))) ice-9/boot-9.scm:1685:16: In procedure raise-exception: ERROR: 1. &platform-not-found-error Entering a new prompt. Type `,bt' for a backtrace or `,q' to continue. --8<---------------cut here---------------end--------------->8--- So my initial issue was attempting to raise on a type rather than an object (which works both ways in other languages such as Python). If I also import srfi-34, then it works as expected: --8<---------------cut here---------------start------------->8--- (use-modules (srfi srfi-34) (srfi srfi-35)) (define-condition-type &platform-not-found-error &error platform-not-found-error?) (raise (condition (&platform-not-found-error))) --8<---------------cut here---------------end--------------->8--- So my original confusing was that there exists a 'raise' procedure in Guile, which has nothing to do with exceptions (it's used to send a signal to the current process). What I'll take from this is to use exclusively 'raise-exception', which is not subject to the above srfi-34 vs builtin raise confusion. Closing, thanks for helping me untangle things! -- Thanks, Maxim