[Haskell-cafe] Exceptions
Niklas Broberg
n_broberg at hotmail.com
Fri Oct 1 15:48:47 EDT 2004
Alastair Reid wrote:
> > 3. Can I define my own exception types?
>
>Sadly, no. There is only one 'exception type'.
>
>You can use dynamics and encode new kinds of exceptions as Strings
> but that isn't very satisfactory.
But not at all, allowing you to declare your own exception types is
*exactly* what using dynamic exceptions is all about. No need for String
encodings, we can do far better than that. =)
If I have my own type of exceptions, by making that type an instance of
Typeable I can use the functions 'throwDyn' and 'catchDyn' instead of the
normal 'throw' and 'catch'. That way I can declare exception handlers that
only exceptions of a particular type, and just re-raises any other.
I could for instance write
main = do ... a bunch of computations ...
`catchDyn` (\e :: MyExceptionType1 -> ... handle exceptions of
MyExceptionType1 ...)
`catchDyn` (\e :: MyExceptionType2 -> ... handle exceptions of
MyExceptionType2 ...)
`catch` (\e -> ... handle exceptions of the built-in Exceptions type
...)
(Note that the type annotations on the patterns are not needed if the types
can be inferred properly from within the handler. Note also that the
Typeable constraint can be automatically derived by ghc with -fglasgow-exts,
so no difficulty there either)
Check the section about dynamic exceptions at
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control.Exception.html
for more info.
> > 4. Can I write code that can catch and handle multiple different
> > exception types from a single block of code?
>
>You use standard Haskell pattern matching so, yes, you can catch multiple
>kinds of exceptions. They're not different types though.
But yes they are, see above. Or rather, they can be, or they can be
constructors of a common user-defined type, combining common pattern
matching with dynamic matching on types. =)
> > 5. Is there anything different about working with exceptions in monads?
>
>Use raiseIO instead of raise to raise exceptions.
The functions for raising exceptions are called 'throw' and 'throwIO' (and
'throwDyn'), not raise.
/Niklas
_________________________________________________________________
The new MSN 8: advanced junk mail protection and 2 months FREE*
http://join.msn.com/?page=features/junkmail
More information about the Haskell-Cafe
mailing list