X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=eightsync%2Fagenda.scm;h=a2463a2a8a892aef7e4dc325558355030227737c;hb=9532a9722a3bf3ba3f4bb9478b3ebd27a3b51af7;hp=edade135c09499e7b08beaf86c573c01d5fb3e1e;hpb=fbb1776a35db50db19fc158381e74361d6e9b789;p=8sync.git diff --git a/eightsync/agenda.scm b/eightsync/agenda.scm index edade13..a2463a2 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 @@ -436,12 +442,6 @@ Will produce (0 . 0) instead of a negative number, if needed." ;;; Asynchronous escape to run things ;;; ================================= -(define (agenda-on-error agenda) - (const #f)) - -(define (agenda-on-fail agenda) - (const #f)) - (define-syntax-rule (%8sync async-request) "Run BODY asynchronously at a prompt, passing args to make-future. @@ -479,7 +479,7 @@ return the wrong thing via (%8sync) and trip themselves up." (define-syntax-rule (propagate-%async-exceptions body) (let ((body-result body)) (if (wrapped-exception? body-result) - (throw '%8sync-caught-error + (throw '8sync-caught-error (wrapped-exception-key body-result) (wrapped-exception-args body-result) (wrapped-exception-stacks body-result)) @@ -512,10 +512,9 @@ return the wrong thing via (%8sync) and trip themselves up." ;; If something bad happened and we didn't catch it, ;; we'll wrap it up in such a way that the continuation ;; can address it - ;; @@: For this stack to work doesn't it have to be (lambda (key . args) (cond - ((eq? key '%8sync-caught-error) + ((eq? key '8sync-caught-error) (match args ((orig-key orig-args orig-stacks) (make-wrapped-exception @@ -546,7 +545,7 @@ return the wrong thing via (%8sync) and trip themselves up." body ...))))) (define-syntax-rule (catch-8sync exp (handler-key handler) ...) - (catch '%8sync-caught-error + (catch '8sync-caught-error (lambda () exp) (lambda (_ orig-key orig-args orig-stacks) @@ -554,7 +553,7 @@ return the wrong thing via (%8sync) and trip themselves up." ((or (eq? handler-key #t) (eq? orig-key handler-key)) (apply handler orig-stacks orig-args)) ... - (else (raise '%8sync-caught-error + (else (raise '8sync-caught-error orig-key orig-args orig-stacks)))))) ;; Alias...? @@ -693,13 +692,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 ...)