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 evaluate x and return $! x, analogous to the difference between throwIO and throw. If the lazy value x throws an exception, return $! x will fail to return an IO action and will throw an exception instead. evaluate x, on the other hand, always produces an 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>


Virusvrij. www.avast.com