<div dir="ltr">I don't think there's anything necessarily wrong with ekmett's exceptions package, but you should be aware that it may not do what you expect:<div><br></div><div><div>module Foo where</div><div><br>
</div><div>import Control.Monad.IO.Class</div><div>import Control.Monad.Catch</div><div>import Control.Exception (ArithException)</div><div><br></div></div><div><div>f :: CatchT IO String</div><div>f = catch (liftIO $ (div 1 0) `seq` return "unreachable") (\x -> let _ = x :: ArithException in return "caught it")</div>
<div><br></div><div>g = do</div><div> x <- runCatchT f</div><div> print x</div><div> </div><div>f' :: IO String</div><div>f' = catch ((div 1 0) `seq` return "unreachable") (\x -> let _ = x :: ArithException in return "caught it")</div>
<div><br></div><div>g' = do</div><div> x <- f'</div><div> print x</div></div><div><br></div><div><div>*Foo Control.Exception> g</div><div>*** Exception: divide by zero</div><div>*Foo Control.Exception> g'</div>
<div>"caught it"</div></div><div><br></div><div style>I expect this is actually working as designed, but you still may want to be aware of it.</div><div style><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Mon, Jul 22, 2013 at 3:45 PM, Eric Rasmussen <span dir="ltr"><<a href="mailto:ericrasmussen@gmail.com" target="_blank">ericrasmussen@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div>Thanks John. I'll try it out, along with Kmett's exceptions package I just found:<br><br><a href="http://hackage.haskell.org/packages/archive/exceptions/0.1.1/doc/html/Control-Monad-Catch.html" target="_blank">http://hackage.haskell.org/packages/archive/exceptions/0.1.1/doc/html/Control-Monad-Catch.html</a><br>
<br></div>I noticed on an issue for lens (<a href="https://github.com/ekmett/lens/issues/301" target="_blank">https://github.com/ekmett/lens/issues/301</a>) they switched to this since MonadCatchIO is deprecated, and it has a more general version of catch:<div class="im">
<br>
<br><pre><a name="1400558b8f3455c5_line-127"></a> <span>catch</span> <span>::</span> <span>Exception</span> <span>e</span> <span>=></span> <span>m</span> <span>a</span> <span>-></span> <span>(</span><span>e</span> <span>-></span> <span>m</span> <span>a</span><span>)</span> <span>-></span> <span>m</span> <span>a</span></pre>
<br><br><br></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Jul 21, 2013 at 6:30 PM, John Lato <span dir="ltr"><<a href="mailto:jwlato@gmail.com" target="_blank">jwlato@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I think most people use monad-control these days for catching exceptions in monad stacks (<a href="http://hackage.haskell.org/package/monad-control-0.3.2.1" target="_blank">http://hackage.haskell.org/package/monad-control-0.3.2.1</a>). The very convenient lifted-base package (<a href="http://hackage.haskell.org/package/lifted-base" target="_blank">http://hackage.haskell.org/package/lifted-base</a>) depends on it and exports a function Control.Exception.Lifted.catch:<div>
<br></div><div><div>Control.Exception.Lifted.catch :: (MonadBaseControl IO m, Exception e)<span style="white-space:pre-wrap">        </span> </div><div><div> => m a<span style="white-space:pre-wrap"> </span>-> (e -> m a) -> m a</div>
</div></div><div><br></div><div>I'd recommend you use that instead of MonadCatchIO.</div></div><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jul 22, 2013 at 4:13 AM, Eric Rasmussen <span dir="ltr"><<a href="mailto:ericrasmussen@gmail.com" target="_blank">ericrasmussen@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div>Arie,<br><br></div>Thanks for calling that out. The most useful part for my case is the MonadCatchIO implementation of catch:<br>
<br>catch :: Exception e => m a -> (e -> m a) -> m a<br>
<br></div>Hoogle shows a few similar functions for that type signature, but they won't work for the case of catching an IOException in an arbitrary monad. Do you happen to know of another approach for catching IOExceptions and throwing them in ErrorT?<br>
<br>Thanks,<br>Eric<br><br><div><br><br><br></div></div><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Jul 21, 2013 at 7:00 AM, Arie Peterson <span dir="ltr"><<a href="mailto:ariep@xs4all.nl" target="_blank">ariep@xs4all.nl</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Thursday 18 July 2013 23:05:33 Eric Rasmussen wrote:<br>
> […]<br>
<div>> Would there be any interest in cleaning that up and adding it (or something<br>
> similar) to Control.Monad.CatchIO?<br>
</div>> […]<br>
<br>
MonadCatchIO-transformers is being deprecated, as recently GHC has removed the<br>
'block' and 'unblock' functions, rendering the api provided by<br>
Control.Monad.CatchIO obsolete.<br>
<br>
<br>
Regards,<br>
<br>
Arie<br>
<div><div><br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br></div>
</div></div><br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div><br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br></div>