
David, I tried your first suggestion $!. Nothing changed. When I tried ‘Right <$> evaluate (TE.decodeUtf8 bufferStrict)’ success. handleException catches the exception. I don’t understand why. Maybe the documentation for the evaluate function below has to do with it: There is a subtle difference between http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Exception-Base... evaluate x and http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Monad.html#v:r... return http://hackage.haskell.org/package/base-4.12.0.0/docs/Prelude.html#v:-36--33... $! x, analogous to the difference between http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Exception-Base... throwIO and http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Exception-Base... throw. If the lazy value x throws an exception, http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Monad.html#v:r... return http://hackage.haskell.org/package/base-4.12.0.0/docs/Prelude.html#v:-36--33... $! x will fail to return an http://hackage.haskell.org/package/base-4.12.0.0/docs/System-IO.html#t:IO IO action and will throw an exception instead. http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Exception-Base... evaluate x, on the other hand, always produces an http://hackage.haskell.org/package/base-4.12.0.0/docs/System-IO.html#t:IO IO action; that action will throw an exception upon execution iff x throws an exception upon evaluation. I don’t fully understand this, but evaluate works. Thanks! Kees readCDFile :: FilePath -> FilePath -> IO (Either String T.Text) readCDFile baseDir fn = do catch ( do buffer <- B.readFile (combine baseDir fn) --reads strict the whole file let bufferStrict = B.toStrict buffer return $ Right $! TE.decodeUtf8 bufferStrict -- this doesn’t work Right <$> evaluate (TE.decodeUtf8 bufferStrict) –- this does liftM Right $ evaluate (TE.decodeUtf8 bufferStrict) – this works too ) exceptionHandler Van: David Fox [mailto:dsf@seereason.com] This fixes it by forcing the evaluation of the decode where it can be caught: return $ Right $! TE.decodeUtf8 bufferStrict or Right <$> evaluate (TE.decodeUtf8 bufferStrict) <snip> --- Dit e-mailbericht is gecontroleerd op virussen met Avast antivirussoftware. https://www.avast.com/antivirus