module Exception
  ( -- * Throwing exceptions
    throwIO
  , MonadThrow(..)
    -- ** Throwing specific exceptions
  , ioError
  , userError
  , exitWith
  , exitFailure
  , exitSuccess
  , die
    -- * Catching exceptions
  , catch
  , catchAny
  , catches
  , Handler(..)
  , catchJust
  , handle
  , handleJust
  , try
  , tryAny
  , tryJust
  , tryIO
    -- * Cleanup
  , bracket
  , bracket_
  , bracketOnError
  , finally
  , onException
    -- * Masking exceptions
  , MaskingState(..)
  , mask
  , mask_
  , uninterruptibleMask
  , uninterruptibleMask_
  , getMaskingState
  , interruptible
  , allowInterrupt
    -- * Exception types
  , SomeException(..)
  , Exception(..)
  , mapException
  , ExitCode(..)
  , IOException
    -- ** Asynchronous exceptions
  , SomeAsyncException(..)
  , AsyncException(..)
  , asyncExceptionToException
  , asyncExceptionFromException
  ) where

import Control.Exception   (AsyncException(..), Exception(..), IOException,
                            MaskingState(..), SomeAsyncException(..),
                            SomeException(..), allowInterrupt,
                            asyncExceptionFromException,
                            asyncExceptionToException, getMaskingState,
                            interruptible, ioError, mapException)
import Control.Monad.Catch (MonadThrow(throwM))
import System.Exit         (ExitCode(..), die, exitFailure, exitSuccess,
                            exitWith)
import System.IO.Error     (userError)
import UnliftIO.Exception  hiding (Exception(..), IOException,
                            SomeAsyncException(..), SomeException(..))