[Haskell-cafe] cannot catch exception

Brandon Allbery allbery.b at gmail.com
Mon Mar 4 20:36:37 UTC 2019


The problem is non-strict evaluation aka "laziness". "return" doesn't force
evaluation of the pure expression you give to it (actual I/O involving its
value generally would, but return just puts a wrapper around it), so its
evaluation is forced later outside of your code to catch it, when the value
is actually examined.

In extreme cases you end up using deepseq's rnf to force full evaluation,
but here it's enough to force evaluation to WHNF with ($!) before handing
the result off to return. With a lazy ByteString you might need rnf, since
($!) would only force part of the structure of the list of chunks but you
would need to force all of the chunks' contents to trigger the decode
exception.

On Mon, Mar 4, 2019 at 3:27 PM Kees Bleijenberg <K.Bleijenberg at lijbrandt.nl>
wrote:

> 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
> <http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Exception-Base.html#v:evaluate>
>  x and return
> <http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Monad.html#v:return>
>  $!
> <http://hackage.haskell.org/package/base-4.12.0.0/docs/Prelude.html#v:-36--33->
>  x, analogous to the difference between throwIO
> <http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Exception-Base.html#v:throwIO>
>  and throw
> <http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Exception-Base.html#v:throw>.
> If the lazy value x throws an exception, return
> <http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Monad.html#v:return>
>  $!
> <http://hackage.haskell.org/package/base-4.12.0.0/docs/Prelude.html#v:-36--33->
>  x will fail to return an IO
> <http://hackage.haskell.org/package/base-4.12.0.0/docs/System-IO.html#t:IO> action
> and will throw an exception instead. evaluate
> <http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Exception-Base.html#v:evaluate>
>  x, on the other hand, always produces an IO
> <http://hackage.haskell.org/package/base-4.12.0.0/docs/System-IO.html#t: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 at 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>
>
>
> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient> Virusvrij.
> www.avast.com
> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient>
> <#m_1428190607071173671_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.



-- 
brandon s allbery kf8nh
allbery.b at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20190304/b5e421ed/attachment-0001.html>


More information about the Haskell-Cafe mailing list