{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE RankNTypes #-} module Managed.Exception ( AgentException(..) , throwM , explain , badNumberOfArgs , noParseArg , probeRuntimeException , badProbeID ) where import Control.Exception (Exception(..), SomeException) import Control.Monad.Catch (throwM) import Data.Managed import GHC.Generics (Generic) data AgentException = BadProbeID ProbeID | BadNumberOfArguments Int Int | NoParseArgument | ProbeRuntimeException String deriving (Show, Eq, Generic) instance Exception AgentException where displayException = explain explain :: AgentException -> String explain (BadProbeID pid) = "Unrecognized ProbeID: " ++ show pid explain (BadNumberOfArguments expected got) = "Bad number of arguments. Expected " ++ show expected ++ ", but got " ++ show got explain NoParseArgument = "Can't parse probe input argument." explain (ProbeRuntimeException reason) = "Exception thrown in probe invocation:\n" ++ reason badNumberOfArgs :: Int -> [a] -> AgentException badNumberOfArgs n xs = BadNumberOfArguments n (length xs) noParseArg :: AgentException noParseArg = NoParseArgument probeRuntimeException :: SomeException -> AgentException probeRuntimeException exception = ProbeRuntimeException (show exception) badProbeID :: ProbeID -> AgentException badProbeID = BadProbeID