
Folks, I have a problem catching my IO exception with the code below. The intent is to catch either the IO exception from connectTo (connection refused, etc.) or the timeout. type EngineState = ErrorT String (StateT World IO) fromIOError err = ioeGetErrorString err liftIOTrap :: IO a -> EngineState a liftIOTrap io = do mx <- liftIO (do x <- io return (return x) `catchError` (\e -> return (throwError (fromIOError e)))) mx timeout secs fun = do resultVar <- newEmptyMVar threadId <- forkIO $ do result <- fun putMVar resultVar result forkIO $ do threadDelay (secs * 1000000) throwError $ userError "Timeout" maybeResult <- takeMVar resultVar killThread threadId return maybeResult connect_ :: HostName -> Int -> IO Handle connect_ h p = connectTo h $ PortNumber $ fromIntegral p connect :: HostName -> Int -> EngineState () connect host port = do w <- get let secs = timeout_seconds w h <- liftIOTrap $ timeout secs $ connect_ host port trace $ "Connection established, h: " ++ show h ... Thanks, Joel -- http://wagerlabs.com/