Proposal: Extensible exceptions

Isaac Dupree isaacdupree at charter.net
Mon Jul 7 14:53:52 EDT 2008


Isaac Dupree wrote:
> I have type issues.

Oh, I forgot to mention: this type is probably a mistake:
mapException :: (Exception e) => (e -> e) -> a -> a
That only allows mapping from any class of exceptions to the same class!

Perhaps this would work better:
mapException :: (SomeException -> SomeException) -> a -> a
although I'm not sure how happy I am with the usage of that type (even 
though it's a "correct" one).  I've never used mapException myself 
though, so I couldn't say.
Maybe,
mapException :: (Exception e) => (e -> SomeException) -> a -> a
or
mapException :: (Exception e1, Exception e2) => (e1 -> e2) -> a -> a
, and perhaps
mapAnyException :: (SomeException -> SomeException) -> a -> a
?

Even, maybe a `mapExceptions` similar to `catches`, although I cringe at 
what it would do with Handler.  I tried replacing
catches :: IO a -> [Handler a] -> IO a
data Handler a = forall e . Exception e => Handler (e -> IO a)
with
catches :: IO a -> [Handler (IO a)] -> IO a
data Handler a = forall e . Exception e => Handler (e -> a)
, but it still doesn't quite seem to work happily? I guess this is 
tolerable:
mapExceptions :: [Handler SomeException] -> a -> a
although
data Handler2 = forall e1 e2. (Exception e1, Exception e2)
     => Handler2 (e1 -> e2)
might be ideal, and
mapExceptions :: [Handler Zero] -> a -> a
where "Zero" is the type that only contains _|_, obviously work just as 
well...

I'm not sure how hard it is for user-level code to deal with 
SomeException directly.  If it's not that hard to do, probably
mapException :: (SomeException -> SomeException) -> a -> a
is the most expedient choice for us?

-Isaac


More information about the Libraries mailing list