diff --git a/src/libstore/s3-binary-cache-store.cc b/src/libstore/s3-binary-cache-store.cc
index ca03c7cd8..f9e583307 100644
--- a/src/libstore/s3-binary-cache-store.cc
+++ b/src/libstore/s3-binary-cache-store.cc
@@ -187,11 +187,7 @@ S3Helper::FileTransferResult S3Helper::getObject(
     });
 
     request.SetContinueRequestHandler([](const Aws::Http::HttpRequest*) {
-        try {
-            checkInterrupt();
-            return true;
-        } catch(...) {}
-        return false;
+        return !isInterrupted();
     });
 
     FileTransferResult res;
@@ -420,10 +416,9 @@ struct S3BinaryCacheStoreImpl : virtual S3BinaryCacheStoreConfig, public virtual
 
             TransferStatus status = transferHandle->GetStatus();
             while (status == TransferStatus::IN_PROGRESS || status == TransferStatus::NOT_STARTED) {
-                try {
-                    checkInterrupt();
+                if (!isInterrupted()) {
                     context->wait();
-                } catch (...) {
+                } else {
                     transferHandle->Cancel();
                     transferHandle->WaitUntilFinished();
                 }
@@ -454,11 +449,7 @@ struct S3BinaryCacheStoreImpl : virtual S3BinaryCacheStoreConfig, public virtual
             });
 
             request.SetContinueRequestHandler([](const Aws::Http::HttpRequest*) {
-                try {
-                    checkInterrupt();
-                    return true;
-                } catch(...) {}
-                return false;
+                return !isInterrupted();
             });
 
             request.SetContentType(mimeType);
diff --git a/src/libutil/include/nix/util/signals.hh b/src/libutil/include/nix/util/signals.hh
index 45130a90c..5a2ba8e75 100644
--- a/src/libutil/include/nix/util/signals.hh
+++ b/src/libutil/include/nix/util/signals.hh
@@ -26,6 +26,11 @@ static inline bool getInterrupted();
  */
 void setInterruptThrown();
 
+/**
+ * @note Does nothing on Windows
+ */
+static inline bool isInterrupted();
+
 /**
  * @note Does nothing on Windows
  */
diff --git a/src/libutil/unix/include/nix/util/signals-impl.hh b/src/libutil/unix/include/nix/util/signals-impl.hh
index ffa967344..7397744b2 100644
--- a/src/libutil/unix/include/nix/util/signals-impl.hh
+++ b/src/libutil/unix/include/nix/util/signals-impl.hh
@@ -85,17 +85,22 @@ static inline bool getInterrupted()
     return unix::_isInterrupted;
 }
 
+static inline bool isInterrupted()
+{
+    using namespace unix;
+    return _isInterrupted || (interruptCheck && interruptCheck());
+}
+
 /**
  * Throw `Interrupted` exception if the process has been interrupted.
  *
  * Call this in long-running loops and between slow operations to terminate
  * them as needed.
  */
-void inline checkInterrupt()
+inline void checkInterrupt()
 {
-    using namespace unix;
-    if (_isInterrupted || (interruptCheck && interruptCheck()))
-        _interrupted();
+    if (isInterrupted())
+        unix::_interrupted();
 }
 
 /**
diff --git a/src/libutil/windows/include/nix/util/signals-impl.hh b/src/libutil/windows/include/nix/util/signals-impl.hh
index 043f39100..f716ffd1a 100644
--- a/src/libutil/windows/include/nix/util/signals-impl.hh
+++ b/src/libutil/windows/include/nix/util/signals-impl.hh
@@ -22,7 +22,12 @@ inline void setInterruptThrown()
     /* Do nothing for now */
 }
 
-void inline checkInterrupt()
+static inline bool isInterrupted()
+{
+    /* Do nothing for now */
+}
+
+inline void checkInterrupt()
 {
     /* Do nothing for now */
 }