MonadIO m => MonadIO (InputT m)
MonadException m => MonadException (InputT m)
MonadIO means you have access to liftIO. liftIO . evaluate . force $ mycode.
MonadException means that you have access to haskeline's exception catching mechanisms.
In System.Console.Haskeline.MonadException, you have the catch, catches, and handle functions which will allow you to catch IO exceptions (in combination with liftIO), and also a bracket which will just let you do arbitrary IO actions and clean up when you are done (or hit an exception).
>let mycode = undefined :: Handle -> IO () -- example code
runInputT _ (bracket (liftIO $ openFile "blah" ReadMode) (liftIO . hClose) (\fp -> liftIO . mycode $ fp))
Another way to use it might be
runInputT _ (liftIO $ mycode _) `catches` [Handler iohandler, Handler anotherhandler]
where
iohandler :: IOException -> IO ()
iohandler e = putStrLn "got io exception" >> return ()
Exceptions are always a pain, and so are transformers, but you get used to them.