Я пытаюсь использовать монадный преобразователь ExceptT
для перехвата любого исключения, выдаваемого функцией, например так:
import Control.Exception
import Control.Monad.Trans.Except
badFunction :: ExceptT SomeException IO ()
badFunction = throw DivideByZero
main :: IO ()
main = do
r <- runExceptT badFunction
case r of Left _ -> putStrLn "caught error"
Right _ -> putStrLn "nope, didn't catch no error"
... но исключение благополучно пролетает мимо. Что я делаю не так?
Изменить: чтобы уточнить, цель состоит в том, чтобы поймать любое исключение, созданное функцией, независимо от того, как это исключение было создано. Если это имеет какое-то значение, реальный вызов функции находится в нижней части довольно глубокого стека преобразования монад. Я не возражаю против пропуска таких вещей, как брошенные строки (плохой программист!).