diff --git a/antiope-core.cabal b/antiope-core.cabal
--- a/antiope-core.cabal
+++ b/antiope-core.cabal
@@ -1,7 +1,7 @@
 cabal-version: 2.4
 
 name:                   antiope-core
-version:                7.4.5
+version:                7.5.0
 description:            Please see the README on Github at <https://github.com/arbor/antiope#readme>.
 synopsis:               Please see the README on Github at <https://github.com/arbor/antiope#readme>
 category:               Services
diff --git a/src/Antiope/Core/Error.hs b/src/Antiope/Core/Error.hs
--- a/src/Antiope/Core/Error.hs
+++ b/src/Antiope/Core/Error.hs
@@ -1,22 +1,29 @@
+{-# LANGUAGE LambdaCase          #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 
 module Antiope.Core.Error
   ( handle404ToNone
+  , handleServiceError
   ) where
 
 import Control.Monad.Catch       (catch, throwM)
 import Network.AWS               (Error (..), MonadAWS, ServiceError (..))
 import Network.HTTP.Types.Status (Status (..))
 
-import qualified Data.ByteString.Lazy as LBS
-
 handle404ToNone :: MonadAWS m
   => m a
   -> m (Maybe a)
-handle404ToNone f = do
-  ebs <- (Right <$> f) `catch` \(err :: Error) -> case err of
-    (ServiceError (ServiceError' _ (Status 404 _) _ _ _ _)) -> return (Left LBS.empty)
-    _                                                       -> throwM err
-  case ebs of
-    Right bs -> return (Just bs)
-    Left _   -> return Nothing
+handle404ToNone f =
+  handleServiceError f Just $ \case
+    (Status 404 _) -> Just Nothing
+    _              -> Nothing
+
+handleServiceError :: MonadAWS m
+  => m a                  -- ^ AWS action
+  -> (a -> b)             -- ^ Transform successful result
+  -> (Status -> Maybe b)  -- ^ Compensate with the failure. 'Nothing' means that the error is not handled
+  -> m b                  -- ^ Final result. In case of unhandled errors the exception is re-thrown.
+handleServiceError ma success failure =
+  (success <$> ma) `catch` \(err :: Error) -> case err of
+    (ServiceError (ServiceError' _ status _ _ _ _)) -> maybe (throwM err) pure (failure status)
+    _                                               -> throwM err
