X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;ds=sidebyside;f=eightsync%2Fagenda.scm;h=2a431351af99b08ca06efed0c0afc03f28375f73;hb=bab788cecd849975fc10e39b193dad304b186fe4;hp=5865bba3e84790c841c4da1ff4e13244f2cb3d4c;hpb=ebe800645bb4c0c98e55158e020a1014a982a50f;p=8sync.git diff --git a/eightsync/agenda.scm b/eightsync/agenda.scm index 5865bba..2a43135 100644 --- a/eightsync/agenda.scm +++ b/eightsync/agenda.scm @@ -67,6 +67,12 @@ catch-8sync catch-%8sync + ;; used for introspecting the error, but a method for making + ;; is not exposed + wrapped-exception? + wrapped-exception-key wrapped-exception-args + wrapped-exception-stacks + print-error-and-continue %current-agenda @@ -692,13 +698,29 @@ return the wrong thing via (%8sync) and trip themselves up." (agenda-queue agenda)) (loop agenda)))))) -(define (print-error-and-continue . args) +(define (print-error-and-continue key . args) "Frequently used as pre-unwind-handler for agenda" - (format (current-error-port) "\n*** Caught exception with arguments: ~s ***\n" - args) - (display-backtrace (make-stack #t 1 0) - (current-error-port)) - (newline (current-error-port))) + (cond + ((eq? key '8sync-caught-error) + (match args + ((orig-key orig-args stacks) + (display "\n*** Caught async exception. ***\n") + (format (current-error-port) + "* Original key '~s and arguments: ~s *\n" + orig-key orig-args) + (display "* Caught stacks below (ending with original) *\n\n") + (for-each + (lambda (s) + (display-backtrace s (current-error-port)) + (newline (current-error-port))) + stacks)))) + (else + (format (current-error-port) + "\n*** Caught exception with key '~s and arguments: ~s ***\n" + key args) + (display-backtrace (make-stack #t 1 0) + (current-error-port)) + (newline (current-error-port))))) (define-syntax-rule (maybe-catch-all (catch-handler pre-unwind-handler) body ...)