diff options
| author | Andy Wingo <wingo@pobox.com> | 2017-02-07 10:10:49 +0100 |
|---|---|---|
| committer | Andy Wingo <wingo@pobox.com> | 2017-02-07 10:10:49 +0100 |
| commit | 7a16d371c60cb85dacd45b7e9e367617dcea2b5d (patch) | |
| tree | ad44abeab4c57e49e69c6ac6c9b2512a715acd29 /fibers | |
| parent | Update doc version. (diff) | |
| download | guile-fibers-7a16d371c60cb85dacd45b7e9e367617dcea2b5d.tar.gz | |
Better exception handling
* fibers/internal.scm (create-fiber): Add a start-stack and a catch-all
around the fiber thunk. Note that in practice this needs the recent
post-2.1.6 patch in Guile (498f3f95684361f3591106a8f9cb9065fd649288)
to work well.
Diffstat (limited to 'fibers')
| -rw-r--r-- | fibers/internal.scm | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/fibers/internal.scm b/fibers/internal.scm index 332b4b5..a495eb1 100644 --- a/fibers/internal.scm +++ b/fibers/internal.scm @@ -367,10 +367,23 @@ parameter mutations to the fiber." (let* ((fiber (make-fiber sched #f)) (thunk (let ((dynamic-state (current-dynamic-state))) (lambda () - (with-dynamic-state dynamic-state - (lambda () - (current-fiber fiber) - (thunk))))))) + (with-dynamic-state + dynamic-state + (lambda () + (current-fiber fiber) + (catch #t + (lambda () + (%start-stack #t thunk)) + (lambda _ #f) + (let ((err (current-error-port))) + (lambda (key . args) + (false-if-exception + (let ((stack (make-stack #t 4))) + (format err "Uncaught exception in fiber #~a:\n" + (nameset-ref fibers-nameset fiber)) + (display-backtrace stack err) + (print-exception err (stack-ref stack 0) + key args)))))))))))) (nameset-add! fibers-nameset fiber) (schedule-fiber! fiber thunk))) |
