diff --git a/src/cuirass/utils.scm b/src/cuirass/utils.scm
index 56dfcede8cf5eefce9a695798c4b3ebef9d7d5ac..947bf71562922be6f4b19ab0b554baa921e7cb95 100644
--- a/src/cuirass/utils.scm
+++ b/src/cuirass/utils.scm
@@ -71,10 +71,19 @@ value."
   (let ((channel (make-channel)))
     (call-with-new-thread
      (lambda ()
-       (call-with-values thunk
-         (lambda values
-           (put-message channel values)))))
-    (apply values (get-message channel))))
+       (catch #t
+         (lambda ()
+           (call-with-values thunk
+             (lambda values
+               (put-message channel `(values ,@values)))))
+         (lambda args
+           (put-message channel `(exception ,@args))))))
+
+    (match (get-message channel)
+      (('values . results)
+       (apply values results))
+      (('exception . args)
+       (apply throw args)))))
 
 (define-syntax-rule (non-blocking exp ...)
   "Evalaute EXP... in a separate thread so that it doesn't block the execution