[Haskell-cafe] Re: Exception handling in numeric computations
Henning Thielemann
lemming at henning-thielemann.de
Mon Mar 30 17:49:39 EDT 2009
On Mon, 30 Mar 2009, Simon Marlow wrote:
> Nicolas Pouillard wrote:
>>
>> By reading the documentation of 'hGetLine' [1] one can see that this
>> function
>> can throw only an EOF exception so why not give it a type like below?
>>
>> hGetLine :: Handle -> ErrorT EOF IO String
>>
>> Since one will have to handle the error case it would be better to
>> treat only the possible cases, no?
>
> I'm afraid the documentation is incomplete. hGetLine can also fail because
> e.g. the device it was reading from has been unplugged, or it was reading
> from a network filesystem and the network has gone down. And there might be
> yet more errors to be invented in the future, so I'm not sure it would be a
> good idea to reflect this level of detail in the type.
Or the file could get read-protected. In principle I like to show the
possible exceptions by types, but the point Simon raises is also
important. I think IOError is good here and one must use the IOError
analysis functions, to find out whether one can do something more specific
in the case. For the default case there should be good possibilities to
report the exception, e.g. translate it to the user language. For example
when a file was not found, one can tell the user how to obtain it. But if
the file is read-protected, a default message would suffice.
The type IOError would still exclude an exception like "Parser failure".
Thus explicit IOError is more descriptive than the implicit exceptions in
IO monad today. It's still interesting how to handle sets of exceptions.
If you use the exception type (Either ParserException IOError) then this
is different from (Either IOError ParserException). I think we should use
type classes for exceptions. Then you can use one type containing all
exceptions in an application, but the type signature tells which
exceptions are actually possible. E.g.
parser :: ParserException e => ExceptionalT e ParserMonad a
getLine :: IOException e => ExceptionalT e IO String
fileParser :: (ParserException e, IOException e) => ExceptionalT e IO String
More information about the Haskell-Cafe
mailing list