[Haskell-cafe] Extensible Exceptions

Thomas Schilling nominolo at googlemail.com
Sat Nov 22 10:27:54 EST 2008


2008/11/22 David F. Place <d at vidplace.com>:
> On Sat, 2008-11-22 at 11:33 +0000, Thomas Schilling wrote:
>> Be careful, though.  This only works if there's a single constructor
>> for your exception type. If there are multiple, you should write it
>> like this:
>>
>>   thing_to_try `catch` \(e :: MyErrorType) -> case e of MyError1 _ ->
>> ..; MyError2 _ -> ...
>>
>> If you write `catch` (MyError1 ...) and a MyError2 is thrown, you will
>> get a pattern match error exception.
>>
>
> Since I am trying to replicate the behavior of errorCalls, I have only
> the single constructor ErrorCall to worry about.  I don't understand
> though, how this works:  I have a predicate
>
>        errorCalls e@(ErrorCall _) = Just e
>
> In the following transcript it seems to work correctly even if something
> beside ErrorCall is thrown.   Passing NonTermination to errorCalls get a
> type error as expected.  Why does it work inside tryJust?
>
>
>        *Main> tryJust errorCalls $ print $ [] !! 23
>        tryJust errorCalls $ print $ [] !! 23^JLeft Prelude.(!!): index
>        too large
>
>        *Main> tryJust errorCalls $ print $ throw NonTermination
>        tryJust errorCalls $ print $ throw NonTermination^J***
>        Exception: <<loop>>

It doesn't.  The last line is printed by GHCi.

Note the missing "Exception: " in the first call.


More information about the Haskell-Cafe mailing list