[Haskell-cafe] Correct way to "catch all exceptions"

Michael Snoyman michael at snoyman.com
Wed Jul 10 08:28:12 CEST 2013

There's a pattern that arises fairly often: catching every exception thrown
by code. The naive approach is to do something like:

    result <- try someCode
    case result of
        Left (e :: SomeException) -> putStrLn $ "It failed: " ++ show e
        Right realValue -> useRealValue

This seems perfectly valid, except that it catches a number of exceptions
which seemingly should *not* be caught. In particular, it catches the async
exceptions used by both killThread and timeout.

I think it's fair to say that there's not going to be a single function
that solves all cases correctly, but it is a common enough situation that
people need to write code that resumes work in the case of an exception
that I think we need to either have some guidelines for the right approach
here, or perhaps even a utility function along the lines of:

    shouldBeCaught :: SomeException -> Bool

One first stab at such a function would be to return `False` for
AsyncException and Timeout, and `True` for everything else, but I'm not
convinced that this is sufficient. Are there any thoughts on the right
approach to take here?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20130710/cb4efba2/attachment.htm>

More information about the Haskell-Cafe mailing list