Hello. I have some problem with catching error.

My function try to read value from string and if it's fails - return default (d).
With this:
>import Control.Exception
>readIOWith :: Read a => a -> String -> IO a          
>readIOWith d x = catch tryRead errHandler
>    where errHandler :: SomeException -> IO a
>              errHandler _ = return d
>              tryRead        = readIO x

I have error:
Could not deduce (a ~ a1)
    from the context (Read a)
      bound by the type signature for
                 readIOWith :: Read a => a -> String -> IO a
      at BWClub/Common/Helpers/Packets.hs:(19,1)-(22,33)
      `a' is a rigid type variable bound by
          the type signature for readIOWith :: Read a => a -> String -> IO a
          at BWClub/Common/Helpers/Packets.hs:19:1
      `a1' is a rigid type variable bound by
           the type signature for errHandler :: SomeException -> IO a1
           at BWClub/Common/Helpers/Packets.hs:21:11
    In the first argument of `return', namely `d'
    In the expression: return d
    In an equation for `errHandler': errHandler _ = return d

But this code works:
>readIOWith d x = catch tryRead (\e -> print (e :: SomeException) >> return d) 
>    where tryRead      = readIO x

Sorry for my english.