@@ -21,6 +21,7 @@ module Katip.Monadic
2121 logFM
2222 , logTM
2323 , logItemM
24+ , logExceptionM
2425
2526 -- * Machinery for merging typed log payloads/contexts
2627 , KatipContext(..)
@@ -64,6 +65,7 @@ import qualified Control.Monad.Trans.Writer.Strict as Strict (WriterT)
6465import Data.Aeson
6566import qualified Data.HashMap.Strict as HM
6667import Data.Monoid
68+import Data.Text (Text)
6769import Language.Haskell.TH
6870-------------------------------------------------------------------------------
6971import Katip.Core
@@ -179,6 +181,22 @@ logTM :: ExpQ
179181logTM = [| logItemM (Just $(getLoc)) |]
180182
181183
184+-------------------------------------------------------------------------------
185+-- | Perform an action while logging any exceptions that may occur.
186+-- Inspired by 'onException`.
187+--
188+-- >>>> error "foo" `logExceptionM` ErrorS
189+logExceptionM
190+ :: (KatipContext m, MonadCatch m, Applicative m)
191+ => m a -- ^ Main action to run
192+ -> Severity -- ^ Severity
193+ -> m a
194+logExceptionM action sev = action `catchAll` \e -> f e >> throwM e
195+ where
196+ f e = logFM sev (msg e)
197+ msg e = ls ("An exception has occured: " :: Text) <> showLS e
198+
199+
182200-------------------------------------------------------------------------------
183201-- | Wrapper over 'ReaderT' that provides a passthrough instance for
184202-- 'MonadReader' so your stack will not be affected. Also provides a