I am trying to catch exception due to with the action ([1,2] !! 3). I can not.
I was trying
let a = [1,2]
handle (\(e :: SomeException) -> print "err" >> return 1) (return $ a !! 3)
Control.Exception.catch (return $ a !! 3) (\(e::SomeException) -> print "err" >> return 1)
in both i get Exception: Prelude.(!!): index too large*
Is it possible? Probably i am to use Maybe approach.
Thanks for help.
Laziness and exceptions, like laziness and parallelism, interact in subtle ways!
The return
wraps up your array access in a thunk, so that it is returned unevaluated, causing the exception to be evaluated outside of the handler.
The solution is to ensure that evaluating return
must also evaluate the list index. This can be done via $!
in this case:
handle ((e :: SomeException) -> print "err" >> return 1) (return $! a !! 3)
This usually means your code is too lazy and the dereference happens after the handler returns. Try using $!
instead of $
to force evaluation.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With