这是我的问题
我正在使用Control.Exception.catch进行异常处理,它具有以下类型: (从Hoogle中挑选出来)
catchSource
:: Exception e
=> IO a
The computation to run
-> (e -> IO a)
Handler to invoke if an exception is raised
-> IO a
这是我将传递给我的处理函数
的构造函数> data JobException = PreProcessFail
> | JobFail
> | ChartFail
> deriving (Show, Typeable)
> instance Control.Exception JobException
这是现在的Handler功能:
> exceptionHandler :: JobException -> IO ()
> exceptionHandler exception = do
> writeFile "testException.txt" ("caught exception " ++ show exception )
我将使用它来做一些日志记录。我需要记录的信息将记录在案 JobState类型
> type JobState = MVar ProcessConfig
> data ProcessConfig = PConfig { model :: ServerModel
> , ipAddress :: String
> , cookie :: Cookie
> } deriving Show
因为我需要一个强制拥有上面提到的类型的处理程序,并且我需要一个JobState,我认为答案是重写JobException以隐藏其中的JobState。这似乎是GADT的工作!我不确定,这是新的领域。
我是对的吗?我可以用GADT解决这个问题吗? 有人能提供一个如何开始构建一个线索的线索吗?我一直在阅读的教程假设你试图解决一个比我更复杂的问题。
如果我错了,有人能指出我正确的方向吗?
更新:我从1了解了动态类型,之后不久发现了Data.Dynamic。 变暖了?
答案 0 :(得分:3)
异常的Show实例主要用于您自己不处理异常并将其打印到程序中的其他位置(例如,在顶层)。由于您使用自定义处理程序捕获异常,因此您应该只能将JobState
置于异常中并为其提供一个简单的Show
实例。
例如:
data JobState = JobSuccess | JobFail deriving Show
newtype JobException = JobException (MVar JobState) deriving Typeable
instance Show JobException where
show _ = "JobException"
instance Exception JobException
exceptionHandler :: JobException -> IO ()
exceptionHandler (JobException m) = takeMVar m >>= print