-
Notifications
You must be signed in to change notification settings - Fork 22
Open
Description
bracket (and similar functions) discards the ExceptionContext associated with an exception.
For example, the following code:
{-# LANGUAGE DeriveAnyClass #-}
import Control.Exception as BaseException
import Control.Exception.Annotation
import Control.Exception.Context
import GHC.Generics
import Control.Monad.Trans.Resource
import Control.Monad.Trans
import Control.Exception.Safe as SafeException
data Ann = Ann String
deriving (Generic, ExceptionAnnotation, Show)
data Exc = Exc String
deriving (Generic, Exception, Show)
main = do
BaseException.bracket_ (pure ()) (pure ()) $ do
annotateIO (Ann "I'm a nice annotation") $ BaseException.throwIO (Exc "failure!!")When run, with ghc-9.12.2 and safe-exception-0.1.7.4 would result into:
$ runhaskell BracketExceptionHandling.hs
BracketExceptionHandling.hs: Uncaught exception ghc-internal:GHC.Internal.Exception.ErrorCall:
Exc "failure!!"
Ann "I'm a nice annotation"
HasCallStack backtrace:
throwIO, called at BracketExceptionHandling.hs:18:52 in main:Main
However, replace BaseException.bracket_ by SafeException.bracket_ and you'll get:
runhaskell BracketExceptionHandling.hs
BracketExceptionHandling.hs: Uncaught exception ghc-internal:GHC.Internal.Exception.ErrorCall:
Exc "failure!!"
While handling Exc "failure!!"
HasCallStack backtrace:
bracket_, called at BracketExceptionHandling.hs:17:7 in main:Main
I was initially surprised by this behavior because my initial (and wrong) understanding is that bracket_ from safe-exceptions behaves the same as the one from base: it does not care about the fact that the exception is async or not, so I initially thought that it was a reexport.
However it behaves differently: it uses uninterruptibleMask.
Metadata
Metadata
Assignees
Labels
No labels