actors: Catch all errors in the actor model.
authorChristopher Allan Webber <cwebber@dustycloud.org>
Tue, 3 May 2016 23:05:31 +0000 (18:05 -0500)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Tue, 3 May 2016 23:05:31 +0000 (18:05 -0500)
Not doing so results in a SIGABRT.

* 8sync/systems/actors.scm (hive-process-message): Catch all errors
  and call print-error-and-continue.  Leave comment for thoughts on
  using maybe-catch-all.

8sync/systems/actors.scm

index c75a25aaa5de0421f775c834d82a306048295077..0659eb52c95f45b5323dcf9e44e887a3a02ebc0a 100644 (file)
@@ -538,13 +538,23 @@ more compact following syntax:
 
   (define (call-catching-coroutine thunk)
     (define (call-catching-errors)
-      (with-throw-handler
-          #t thunk
-          (lambda (key . args)
-            (if (message-needs-reply message)
-                ;; If the message is waiting on a reply, let them know
-                ;; something went wrong.
-                (hive-reply-with-error hive message key args)))))
+      ;; TODO: maybe parameterize and use maybe-catch-all from agenda.scm
+      ;; @@: Why not just use with-throw-handler and let the catch
+      ;;   happen at the agenda?  That's what we used to do, but
+      ;;   it ended up with a SIGABRT.  See:
+      ;;     http://lists.gnu.org/archive/html/bug-guile/2016-05/msg00003.html
+      (catch #t
+        thunk
+        ;; In the actor model, we don't totally crash on errors.
+        (lambda _ #f)
+        ;; If an error happens, we raise it
+        (lambda (key . args)
+          (if (message-needs-reply message)
+              ;; If the message is waiting on a reply, let them know
+              ;; something went wrong.
+              (hive-reply-with-error hive message key args))
+          ;; print error message
+          (apply print-error-and-continue key args))))
     (call-with-prompt (hive-prompt hive)
       call-catching-errors
       (lambda (kont actor message)