diff --git a/library/SlaveThread.hs b/library/SlaveThread.hs
--- a/library/SlaveThread.hs
+++ b/library/SlaveThread.hs
@@ -89,12 +89,14 @@
     slaveThread <-
       forkIOWithoutHandler $ do
         slaveThread <- myThreadId
-        catch (void $ unmask computation) $
-          PartialHandler.totalizeRethrowingTo_ masterThread $ 
-            PartialHandler.onThreadKilled (return ())
-        -- Context management:
-        killSlaves slaveThread
-        waitForSlavesToDie slaveThread
+        catch
+          (unmask $ do
+            computation
+            -- Context management:
+            killSlaves slaveThread
+            waitForSlavesToDie slaveThread)
+          (PartialHandler.totalizeRethrowingTo_ masterThread
+            (PartialHandler.onThreadKilled (return ())))
         -- Finalization:
         catch (void finalizer) $
           PartialHandler.totalizeRethrowingTo_ masterThread $ mempty
diff --git a/slave-thread.cabal b/slave-thread.cabal
--- a/slave-thread.cabal
+++ b/slave-thread.cabal
@@ -1,7 +1,7 @@
 name:
   slave-thread
 version:
-  1.0.2.2
+  1.0.2.3
 synopsis:
   A fundamental solution to ghost threads and silent exceptions
 description:
@@ -74,7 +74,7 @@
   exposed-modules:
     SlaveThread
   build-depends:
-    base >=4.6 && <5,
+    base >=4.9 && <5,
     deferred-folds >=0.9 && <0.10,
     foldl >=1 && <2,
     mmorph >=1.0.4 && <2,
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -12,6 +12,28 @@
   htfMain $ htf_thisModulesTests
 
 
+test_failingInFinalizerDoesntBreakEverything =
+  do
+    finalizer1CalledVar <- newTVarIO False
+    finalizer2CalledVar <- newTVarIO False
+    let
+      finalizer1 =
+        atomically $ writeTVar finalizer1CalledVar True
+      finalizer2 =
+        do
+          atomically $ writeTVar finalizer2CalledVar True
+          throwIO (userError "finalizer2 failed")
+      in do
+        result :: Either SomeException () <- try $ do
+          S.forkFinally finalizer1 $ do
+            S.forkFinally finalizer2 $ threadDelay 100
+          threadDelay (10^4)
+        assertEqual "Left user error (finalizer2 failed)" (show result)
+        finalizer2Called <- atomically (readTVar finalizer2CalledVar)
+        finalizer1Called <- atomically (readTVar finalizer1CalledVar)
+        assertEqual True finalizer2Called
+        assertEqual True finalizer1Called
+
 test_forkedThreadsRunFine = 
   replicateM 100000 $ do
     var <- newMVar 0
