{-# LANGUAGE MagicHash, DeriveDataTypeable #-} import Control.Exception import Control.Concurrent.STM hiding (catchSTM) import Data.Data import Data.Maybe import Data.Typeable import GHC.Prim (raiseIO#) import qualified GHC.Conc as C import GHC.Conc (STM(..)) throwSTM :: Exception e => e -> STM a throwSTM = STM . raiseIO# . toException catchSTM :: Exception e => (STM a) -> (e -> STM a) -> STM a catchSTM stm h = C.catchSTM stm (h . fromJust . fromException . toException) data DummyException = DummyException deriving (Data,Typeable,Show) instance Exception DummyException test1 = throwSTM DummyException test2 = catchSTM test1 $ \DummyException -> return 5